我正在编写一个库来访问用于管理后端系统中数据的网络应用编程接口。该库还将为类提供正确管理数据的逻辑。由于这个原因,大多数类不能有属性的公共设置器或接受所有属性的公共构造函数。相反,我试图使用一个具有内部访问修饰符的构造函数,它可以设置所有属性。
当试图使用System反序列化JSON字符串时。文本。json它将忽略内部构造函数-它将使用其他构造函数或抛出异常。我还尝试用[JsonConstructor]
注释内部构造函数,但它什么也做不了。
具有内部构造函数的示例类:
public class Entry
{
public int Id { get; }
public string Name { get; set; }
public string Value { get; set; }
[JsonConstructor]
internal Entry(int id, string name, string value)
{
this.Id = id;
this.Name = name;
this.Value = value;
}
}
假设用户可以使用库从后端获取一个Entry
,修改它的名称和值,并更新它。用户不应该能够更改Id
属性或创建新的Entry
。
反序列化示例:
var json = "{\"id\": 1337, \"name\": \"TestEntry\", \"value\": \"TestValue\"}";
var options = new JsonSerializerOptions(JsonSerializerDefaults.Web);
var entry = JsonSerializer.Deserialize<Entry>(json, options);
调用JsonSeriazer。反序列化
将抛出System.不支持在没有无参数构造函数、单数参数化构造函数或带注释的JsonConstructor属性的参数化构造函数的情况下对类型进行反序列化:
一种可能的解决方案是将构造函数公开,并使用[过时(“Message”,true)]
属性对其进行注释-当尝试使用此构造函数时,编译器将抛出并出错,使构造函数不可用。但我觉得这不是最优雅的解决方案,它还滥用了[过时]
属性。
有没有其他办法解决这个问题?
在这种情况下,实现这一点的最佳方法是使用单独的模型进行序列化。然后在Domain模型上使用内部构造函数。
public class EntryDto
{
public int Id { get; }
public string Name { get; }
public string Value { get; }
[JsonConstructor]
public EntryDto(int id, string name, string value)
{
this.Id = id;
this.Name = name;
this.Value = value;
}
public Entry ToDomainModel()
{
return new Entry(this.Id, this.Name, this.Value);
}
}
public class Entry
{
public int Id { get; }
public string Name { get; }
public string Value { get; }
internal Entry(int id, string name, string value)
{
this.Id = id;
this.Name = name;
this.Value = value;
}
}
```