Hinweis: Die Frage ist auf C# UWP beschränkt.Wie erreichen Sie die ideale JSerialisierung/Deserialisierung in C# UWP?
Der Traum:
public static class Serializer {
// return json string
public string Serialize(object obj) { ??? }
// return T from json string
public T Deserialize<T>(string jsonString) { ??? }
}
Closest Ich bin gekommen:
public static class Serializer
{
public static string Serialize(object obj, DataContractJsonSerializerSettings settings=null)
{
if (obj == null) {
throw new NullReferenceException();
}
settings = settings ?? new DataContractJsonSerializerSettings();
DataContractJsonSerializer jsonizer = new DataContractJsonSerializer(obj.GetType(), settings);
string jsonString = null;
using (MemoryStream stream = new MemoryStream())
{
jsonizer.WriteObject(stream, obj);
stream.Position = 0;
StreamReader sr = new StreamReader(stream);
jsonString = sr.ReadToEnd();
}
return jsonString;
}
public static T Deserialize<T>(string jsonString)
{
DataContractJsonSerializer jsonizer = new DataContractJsonSerializer(typeof(T));
T obj;
using (Stream stream = GenerateStreamFromString(jsonString))
{
obj = (T)jsonizer.ReadObject(stream);
}
return obj;
}
private static Stream GenerateStreamFromString(string s)
{
MemoryStream stream = new MemoryStream();
StreamWriter writer = new StreamWriter(stream);
writer.Write(s);
writer.Flush();
stream.Position = 0;
return stream;
}
}
Das Problem
Die Teillösung habe ich geschrieben Werke in einfachen Fällen. Es schlägt jedoch fehl, wenn der Untertyp des Objekts, das deserialisiert wird, schwierig (oder unmöglich) aus der JSON-Zeichenfolge zu bestimmen ist. Zum Beispiel
IList<Animal> animals = new List<Animal>();
animals.add(new Dog("Woofy"));
animals.add(new Cat("Fluffy"));
string json = Serializer.Serialize(animals);
IList<Animal> result = Serializer.Deserialize<List<Animal>>(json);
//^fails because subtype information was lost during serialization
bool succeeded = result.get(0).Name.Equals("Woofy") && result.get(1).Name.Equals("Fluffy");
Was ich suche:
Eine Implementierung des Skeletts in "The Dream" angegeben, die die Fahrer in "The Problem" angegeben gibt. Kommentare willkommen.
Wenn Sie 'DataContractJsonSerializer' verwenden, zu serialisiert und polymorphe Typen deserialisieren, müssen Sie es von allen möglichen Subtypen informieren, dass könnte angetroffen werden. Siehe [Bekannte Daten für Datenverträge] (https: // msdn.microsoft.com/de-de/library/ms730167.aspx), [DataContractSerializer und bekannte Typen] (https://stackoverflow.com/questions/9422662) und/oder [parse.com: SerializationException deserialisieren von JSON-Objekten mit "__type" Eigenschaft] (https://stackoverflow.com/questions/33746518). – dbc
Oder wechseln Sie zu [tag: json.net] und aktivieren Sie ['TypeNameHandling'] (http://www.newtonsoft.com/json/help/html/SerializeTypeNameHandling.htm). Siehe z.B. [JSON-Serialisierung von Arrays mit polymorphen Objekten] (https://stackoverflow.com/questions/5186973). – dbc