【发布时间】:2020-12-29 11:27:43
【问题描述】:
我有 3 节课;它们以下列方式相互包含:
TestClass1
- TestClass2
- TestClass3
- TestClass3
- TestClass2
- TestClass3
- TestClass3
我要做的是序列化然后反序列化这个类结构。
以下是课程:
class TestClass1
{
public List<object> Data { get; set; }
}
class TestClass2
{
public string Data1 { get; internal set; }
public TestClass3 Data2 { get; internal set; }
}
public TestClass3(DateTime dateTime, string v1, string v2, int v3)
{
this.dateTime = dateTime;
this.v1 = v1;
this.v2 = v2;
this.v3 = v3;
}
我正在运行的代码在这里:
var data = new List<TestClass2>()
{
new TestClass2()
{
Data1 = "test1",
Data2 = new TestClass3(new DateTime(2021, 02, 05), "Test", "Test2", 1234)
},
new TestClass2()
{
Data1 = "test2",
Data2 = new TestClass3(new DateTime(2021, 02, 06), "Test", "Test3", 1234)
},
new TestClass2()
{
Data1 = "test1",
Data2 = new TestClass3(new DateTime(2021, 02, 07), "Test23", "Test2", 5545)
},
};
var dataStream = new TestClass1()
{
Data = data.Select(a => (object)a).ToList(),
};
var streamSerialized = JsonSerializer.Serialize(dataStream);
var objects = JsonSerializer.Deserialize<TestClass1>(streamSerialized);
这里有两个问题
首先,对象没有正确序列化streamSerialized 不包含TestClass2.Data2 的任何数据。其次,当我反序列化时,它没有正确反序列化到类结构中——也就是说,如果我这样做:
var class2 = (TestClass2)objects.Data.First();
我收到此错误:
System.InvalidCastException:'无法将'System.Text.Json.JsonElement'类型的对象转换为'ConsoleApp1.TestClass2'类型
【问题讨论】:
-
序列化器不知道如何将
object类型列表反序列化为TestClass2类型列表。 -
您不能将
object与序列化程序一起使用。您需要显式使用您期望的类型,或者如果类型为“未知”,则手动读取和写入JsonElement上的属性。这是一项安全功能。 -
public List<object> Data为什么在这里使用object? -
如果我将
public List<object> Data更改为public List<TestClass2> Data我仍然没有得到任何序列化(streamSerialized Data2 仍然为空) -
我错过了什么?看起来不错dotnetfiddle.net/QPrFCA
标签: c# .net serialization system.text.json