用
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"
上面示例中的类是不可变的。 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;
}
}
一些解释: