[英]Serialization -> how to change Newtonsoft.Json to System.Text.Json?
[英]System.Text.Json Serialization Behaviour
我有 3 節課; 它們以下列方式相互包含:
TestClass1
- TestClass2
- TestClass3
- TestClass3
- TestClass2
- TestClass3
- TestClass3
我要做的是序列化然后反序列化這個 class 結構。
以下是課程:
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
的任何數據。 其次,當我反序列化時,它沒有正確反序列化為 class 結構 - 也就是說,如果我這樣做:
var class2 = (TestClass2)objects.Data.First();
我收到此錯誤:
System.InvalidCastException:“無法將“System.Text.Json.JsonElement”類型的 object 轉換為“ConsoleApp1.TestClass2”類型
反序列化基於作為泛型參數提供給Deserialize()
的類型工作,並且對原始類型一無所知。
如果您使用調試器,您可以看到會發生什么:
您序列化為 json。 JSON 不包含有關原始類型的任何信息:
var streamSerialized = JsonSerializer.Serialize(dataStream);
您反序列化它並告訴 JsonSerializer 使用來自TestClass1
的信息:
var objects = JsonSerializer.Deserialize<TestClass1>(streamSerialized);
TestClass1
告訴 JsonSerializer 所有列表項都是object
:
class TestClass1
{
public List<object> Data { get; set; }
}
沒有什么可以讓序列化程序知道列表項應該是TestClass2
類型,因此它會反序列化為 JsonElements 列表( https://docs.microsoft.com/en-us/dotnet/api/system.text.json.jsonelement?view =凈-5.0 )
...並且 JsonElement 不能強制轉換為 TestClass2。
第一次修復
public List<TestClass2> Data
現在看看你的TestClass2
:
class TestClass2
{
public string Data1 { get; internal set; }
public TestClass3 Data2 { get; internal set; }
}
設置器是內部的,因此值為 null。 提供構造函數或將它們公開。
class TestClass2
{
public string Data1 { get; set; }
public TestClass3 Data2 { get; set; }
}
有關構造函數的用法,請參閱: https://docs.microsoft.com/en-us/dotnet/standard/serialization/system-text-json-immutability?pivots=dotnet-5-0
有關一般行為的更多詳細信息,請參見文檔: https://docs.microsoft.com/en-us/dotnet/standard/serialization/system-text-json-how-to?pivots=dotnet-5-0 #反序列化行為
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.