簡體   English   中英

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM