如何在 System.Text.Json 的帮助下使用公共构造函数反序列化类

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

C#
net7.0
编写的申请。 应用程序序列化类,然后反序列化它。序列化效果很好,但是当使用公共构造函数反序列化类时,序列化程序不会序列化该属性。如何使用公共无参数构造函数反序列化为类的对象?

例如我有一堂课

works
,其中
address
=“abc”。对象被序列化为
{"address" : "abc"}
。之后应该对其进行反序列化。

用于反序列化的代码:

以下类的对象将通过

address
=
"abc"
:

进行反序列化
public class Works
{
    public string address { get; private set; }

    
    Works()
    {
        address = "default";
    }
    public Works(string address)
    {
        this.address = address;
    }
}

以下类的对象将使用

address
=
"default"
进行反序列化,如果我删除字段初始化,它将被反序列化为 address = null。如何用“abc”反序列化它:

public class Doesnt
{
    public string address { get; private set; }

    [JsonConstructor] 
    public Doesnt()
    {
        address = "default";
    }
    public Doesnt(string address)
    {
        this.address = address;
    }
}

反序列化代码:

public byte[] SerializeToBytes<T>(T src)
{
    return JsonSerializer.SerializeToUtf8Bytes(src, SerializerOptions);
}
public object Deserialize(byte[] data, Type type)
{
    object res;
    var str =  System.Text.Encoding.UTF8.GetString(data);
    res = JsonSerializer.Deserialize(str, type, SerializerOptions);
    return res;
}
var objs = new object[]{new Work("abc"),new Doesnt("abc")};
var bytes = SerializeToBytes(obj[0]);
Deserialize(bytes, obj[0].GetType());// reuturns "abc"

bytes = SerializeToBytes(obj[1]);
Deserialize(bytes, obj[1].GetType()); // reuturns "default"
c# json .net serialization system.text.json
1个回答
1
投票

上面示例中的类是不可变的。 Text.Json.Serializer 默认情况下不会反序列化此类类,但有一些方法可以做到这一点:

  • 参数化构造函数
  • 非公开成员和属性访问者
  • 只读属性(从
    .net 8
    开始)

看起来使用

[JsonInclude]
[JsonConstructor]
与参数化构造函数可以是一个解决方案。

public class Doesnt
{
    [JsonInclude]  // this can be solution 1
    public string address { get; private set; }

    public Doesnt()
    {
        address = "default";
    }
    [JsonConstructor] //This can be solution 2, parameters should correspond property names
    public Doesnt(string address)
    {
        this.address = address;
    }
}

一些解释:

  • 默认情况下,System.Text.Json 使用默认的公共无参数构造函数
  • 参数化构造函数,可以反序列化不可变的类或结构
  • 对于具有多个构造函数的结构或类,请通过应用 [JsonConstructor] 属性来指定要使用的构造函数。当不使用该属性时,始终使用公共无参数构造函数(如果存在)。
  • 参数化构造函数的参数名称必须与属性名称和类型匹配
  • 即使使用 [JsonPropertyName] 重命名属性,构造函数参数也必须与实际属性名称匹配。

https://learn.microsoft.com/en-us/dotnet/standard/serialization/system-text-json/immutability#parameterized-constructors

© www.soinside.com 2019 - 2024. All rights reserved.