[英]C# JSON.net NewtonSoft not converting object inheritence correctly
我正在尝试使用JSON.net NewtonSoft对字典中的继承对象进行序列化和反序列化。
在我的程序中,我有3个类,分别是A
, B
和C
B
和C
都继承A
:
public class A
{
public virtual string Value { get; } = "string";
}
public class B : A
{
public override string Value => this.Score.ToString();
public int Score { get; set; } = 5;
}
public class C : A
{
public override string Value => this.AnotherScore.ToString();
public int AnotherScore { get; set; } = 6;
}
在我的代码中,我创建了一个字典,该字典可以讲述继承A
对象,并用B
和C
对象填充它。
当我尝试使用字典中的对象时,C#仍然知道对象是其类型的。 (请参见下面的代码)
但是,序列化和反序列化后,C#不明白,它具有治疗B
和C
对象在词典中B
和C
对象。
static void Main(string[] args)
{
// Create objects to store in dictionary
B b = new B();
A c = (A)new C();
// Store objects in dictionary
var dic = new Dictionary<string, A>();
dic.Add("b", b);
dic.Add("c", c);
// C# still know the objects are of their type
Console.WriteLine(dic["b"].Value);
Console.WriteLine(dic["c"].Value);
// Convert dictionary to JSON
string serialized = JsonConvert.SerializeObject(dic, new JsonSerializerSettings()
{
Formatting = Formatting.Indented,
PreserveReferencesHandling = PreserveReferencesHandling.Objects,
TypeNameHandling = TypeNameHandling.Objects,
});
Console.WriteLine(serialized);
// Convert json to dictionary
var dic2 = JsonConvert.DeserializeObject<Dictionary<string, A>>(serialized);
// C# doesn't know objects are of their type anymore
Console.WriteLine(dic2["b"].Value);
Console.WriteLine(dic2["c"].Value);
Console.ReadKey();
}
输出:
5
6
{
"$id": "1",
"$type": "System.Collections.Generic.Dictionary`2[[System.String, mscorlib],[TestConsole.A, TestConsole]], mscorlib",
"b": {
"$id": "2",
"$type": "TestConsole.B, TestConsole",
"Value": "5",
"Score": 5
},
"c": {
"$id": "3",
"$type": "TestConsole.C, TestConsole",
"Value": "6",
"AnotherScore": 6
}
}
string
string
我如何让NewtonSoft知道应该使用正确的类型正确序列化对象?
这样后两行的写操作将与前两行相同。
将相同的设置传递给DesirializeObject将解决此问题。
很抱歉打扰。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.