【发布时间】:2016-05-19 03:55:32
【问题描述】:
注意:问题仅限于 C# UWP。
梦想:
public static class Serializer {
// return json string
public string Serialize(object obj) { ??? }
// return T from json string
public T Deserialize<T>(string jsonString) { ??? }
}
最近的一次:
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;
}
}
问题
我发布的部分解决方案适用于简单的情况。但是,当被反序列化的对象的子类型很难(或不可能)从 json 字符串中确定时,它会失败。例如,
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");
我在寻找什么:
“梦想”中指定的骨架的实现,它通过“问题”中指定的驱动程序。欢迎评论。
【问题讨论】:
-
如果您使用
DataContractJsonSerializer来序列化和反序列化多态类型,您需要告知它可能遇到的所有可能的子类型。请参阅Data Contract Known Types、DataContractSerializer and Known Types 和/或parse.com: SerializationException deserializing JSON objects with “__type” property。
标签: c# json serialization