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 から継承しています (継承を削除するか、メンバーに別の型を与えると機能します)。
データをシリアル化する前は「正しい」データであり、逆シリアル化した後のデータは「間違っている」-> メンバーは null です。
それを手伝ってもらえますか?