有没有办法序列化然后反序列化具有未知类型的成员变量的类,该类可以是简单的值类型,也可以是包含类本身的实例?
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类型。
答案 0 :(得分:0)
你不能施展你认为自己正在施展的东西。
在这种情况下,您实际上将fdsa.txt
属性转换为Value
。在访问属性之前,您需要使用强制转换将A
实例包装在参数中。
aaa2
答案 1 :(得分:0)
Dynamic主要是编译器黑客,我会建议使用泛型。 @David L的回答也是正确的。
public class A<T>
{
public T Value { get; set; }
}