System.Text.Json 现在是否始终需要无参数构造函数?

问题描述 投票:0回答:1

我正在将项目更新到 .NET 8,一些以前的可序列化/反序列化模型类现在抛出此错误:

“MyModel”类型的反序列化构造函数中的每个参数必须绑定到反序列化时的对象属性或字段。每个参数名称必须与对象上的属性或字段匹配。仅当启用“JsonSerializerOptions.IncludeFields”时才考虑字段。匹配可以不区分大小写。

我似乎能够阻止异常的唯一方法是提供一个无参数构造函数,但我不想这样做。

更新

以下代码用于序列化/反序列化

void Main()
{
    RunTests();  // Call RunTests() or press Alt+Shift+T to initiate testing.
}

public class MyClass
{
    public int Number { get; set; }
    public string Text { get; set; }
    
    public MyClass(int num, string characters)
    {
        Number = num;
        Text = characters;
    }

    // public MyClass() {} Test succeeds with parameterless ctor
}

[Fact] void Test_Xunit() 
{
    var mc = new MyClass(88, "foo");
    
    var s = JsonSerializer.Serialize(mc);
    
    var o = JsonSerializer.Deserialize<MyClass>(s);
}

c# .net-8.0 system.text.json
1个回答
0
投票

JsonSerializer
需要无参数构造函数来反序列化对象。由于
MyClass
只有一个带参数的构造函数,反序列化过程
JsonSerializer.Deserialize<MyClass>(s)
将失败,因为如果没有无参数构造函数,它无法实例化
MyClass

众所周知,可以按如下方式完成。

public MyClass() {}

public MyClass(int num, string characters)
{
    Number = num;
    Text = characters;
}
© www.soinside.com 2019 - 2024. All rights reserved.