【发布时间】:2017-02-21 14:03:38
【问题描述】:
有没有办法序列化然后反序列化具有未知类型成员变量的类,该类型可能是简单值类型或包含类本身的实例?
public class A
{
public dynamic Value { get; set; }//Value could be int or type A for example
}
public static class ASerializer
{
public static string ToJson(A table)
{
return JsonConvert.SerializeObject(table);//using Json.Net
}
public static A FromJson(string json)
{
return JsonConvert.DeserializeObject<A>(json);
}
}
public class Tests
{
public static void TestASerialization()
{
var a = new A() { Value = 1 };
var aa = new A { Value = a };
var aaa = new A { Value = aa };
var json = ASerializer.ToJson(aaa);
var aaa2 = ASerializer.FromJson(json);
var aa2 = (A)aaa2.Value; //throws
}
}
如果我序列化然后反序列化 aaa - 我无法将反序列化 aaa 的值转换回我得到的类型 A:
Microsoft.CSharp.RuntimeBinder.RuntimeBinderException:无法将类型“Newtonsoft.Json.Linq.JObject”转换为 'A'
关于优雅地处理这种嵌套层次结构而不诉诸手工编码的任何建议? 似乎只适用于 A 类型为 A 的一个实例。
【问题讨论】:
-
可以使用
TypeNameHandling序列化多态属性,反序列化后保留类型。 -
要将
TypeNameHandling应用于特定属性,请参阅here。 -
谢谢,我确实试过了,但显然没有正确使用 JsonSerializerSettings 和 TypeNameHandling = TypeNameHandling.All 的属性实现它
标签: c# json serialization json.net deserialization