【发布时间】:2013-06-25 22:09:14
【问题描述】:
我正在尝试使用 ServiceStack.Redis,但我注意到,当我存储一个对象时,它的成员是从另一个对象继承的对象,并在稍后尝试获取它时,我得到了 null。
我检查并发现 ServiceStack.Redis 正在使用 ServiceStack.JsonSerializer 所以我尝试创建一个测试用例:
class Program
{
public class ClassA
{
public string Id;
public Dictionary<string, ClassB> dic = new Dictionary<string, ClassB>();
}
public class ClassB
{
public string Id;
}
public class ClassC : ClassB
{
public object C;
}
public class ClassD
{
public string Id;
}
static void Main(string[] args)
{
ClassA t = new ClassA();
t.Id = Guid.NewGuid().ToString("n");
t.dic.Add("AAA", new ClassC());
t.dic["AAA"].Id = Guid.NewGuid().ToString("n");
((ClassC)t.dic["AAA"]).C = new ClassD();
((ClassD)((ClassC)t.dic["AAA"]).C).Id = Guid.NewGuid().ToString("n");
ServiceStack.Text.JsConfig.IncludeNullValues = true;
ServiceStack.Text.JsConfig.IncludePublicFields = true;
ServiceStack.Text.JsConfig.IncludeTypeInfo = true;
ServiceStack.Text.JsConfig.MaxDepth = int.MaxValue;
Console.WriteLine("before SerializeToString data is:");
if (string.IsNullOrEmpty(((ClassD)((ClassC)t.dic["AAA"]).C).Id))
{
Console.WriteLine("wrong");
}
else
{
Console.WriteLine("right");
}
string a = JsonSerializer.SerializeToString<ClassA>(t);
ClassA t2 = JsonSerializer.DeserializeFromString<ClassA>(a);
Console.WriteLine("after SerializeToString data is:");
if (((ClassC)t2.dic["AAA"]).C == null ||
string.IsNullOrEmpty(((ClassD)((ClassC)t2.dic["AAA"]).C).Id))
{
Console.WriteLine("wrong");
}
else
{
Console.WriteLine("right");
}
Console.ReadLine();
}
}
当它不起作用时,我可以找到一个更简单的案例......
如您所见,ClassC 有一个类型为 object 的成员,并且该类从 ClassB 继承(如果您删除继承或为成员提供另一种类型,它将起作用)。
序列化前数据“正确”,反序列化后数据“错误” -> 成员为空。
你能帮帮我吗?
【问题讨论】:
标签: c# json serialization servicestack jsonserializer