我有一个类 struct ,我可以序列化和反序列化,没有问题.我已经在下面的一个人为设计的例子中展示了它

[JsonDerivedType(typeof(Apple),typeDiscriminator: "apple")]
public abstract class Fruit
{
    public Seed seed { get; }

    protected Fruit(Seed seed)
    {
        this.seed = seed;
    }
}

public sealed class Apple : Fruit
{
    [JsonConstructor]
    public Apple(Seed seed) : base(seed) { }
}

public sealed class AppleSeed : Seed
{
    [JsonConstructor]
    public AppleSeed() {}
}

[JsonDerivedType(typeof(AppleSeed),typeDiscriminator: "apple")]
public abstract class Seed { }

但我希望Apple构造函数要求类型为Applesed:

[JsonConstructor]
    public Apple(AppleSeed seed) : base(seed) { }

这可以很好地序列化,但无法反序列化,因为反序列化程序需要基类信息.我试图使用泛型来解决这个问题,但无法解决.有没有一种可靠的方法来使用System.Text.Json来反序列化多态参数,而不实现自定义的反序列化程序?谢谢

推荐答案

文档第Use immutable types and properties: Parameterized constructors页解释了public Apple(AppleSeed seed) : base(seed) { }构造函数的问题:

参数化构造函数的参数名必须与属性名匹配and types.

由于构造函数参数类型AppleSeed seed与属性类型Seed seed不匹配,因此不能使用构造函数参数.演示here不及格.

最简单的解决方法是隐藏具有相同名称和所需类型的new属性的基本类型属性:

public sealed class Apple : Fruit
{
    [JsonConstructor]
    public Apple(AppleSeed seed) : base(seed) { }
    
    public new AppleSeed seed => (AppleSeed)base.seed;
}

另见:

工作小提琴here.

.net相关问答推荐

C#/.NET + VisualStudio,命名空间问题

在 WebApi 中需要 SSL?

异步总是 WaitingForActivation

extern 在 C# 中是如何工作的?

添加新实体标量时实体框架 4 映射片段错误

使用 C# 清除文本文件的内容

C#:内存不足异常

如何判断一个类型是否是简单类型?即持有一个单一的价值

Linq查询分组并 Select 第一个项目

使用 .NET 中的代码更改桌面墙纸

InternalsVisibleTo 属性不起作用

如何对无法加载的 VSTO 插件进行故障排除?

是否有 TLS 1.2 的 .NET 实现?

C#:获得完整的桌面大小?

有没有办法只在 C# 中设置一次属性

C# 的浮点比较函数

beforefieldinit 标志有什么作用?

静态方法继承的正确替代方法是什么?

MVVM 没有意义吗?

C#/.NET 中仅命名空间的类可见性?