System.Text.Json 序列化不使用派生类

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

我有一个名为

Extension
的抽象类,它有几个派生类,例如
DerivedExtensionA
DerivedExtensionB
等。

现在我有一个定义为

List<Extension>
的列表,其中包含派生类实例。

现在,如果我序列化上面的列表,它只会序列化

Extension
中的基类属性,因为该列表具有基类
Extension
类型。如果我将列表定义为
List<DerivedExtensionA>
,然后仅将
DerivedExtensionA
的实例放入其中,那么它们就可以很好地序列化。但我的代码是通用的,应该接受所有类型的扩展,所以这对我来说不是一个可行的解决方案。

所以问题是..

如何保留定义为

List<Extension>
的列表,并且仍然能够完全序列化包含其所有属性的派生类实例?

这是显示此行为的小提琴:https://dotnetfiddle.net/22mbwb

编辑:更正了小提琴 URL

.net-core serialization system.text.json
3个回答
4
投票

来自 如何使用 System.Text.Json 序列化派生类的属性

不支持多态类型层次结构的序列化。

在你的小提琴中,你可以使用对象数组:

string allExtensionsSerialized =
   JsonSerializer.Serialize((object[])allExtensions.ToArray());

这是我最近使用的 hack:

public record MyType(
   // This nonsense is here because System.Text.Json does not support normal polymorphic serialisation
   [property: JsonIgnore] List<X> Messages))
{
   // This nonsense is here because System.Text.Json does not support normal polymorphic serialisation
   [JsonPropertyName("Messages")]
   public object[] MessagesTrick => Messages.ToArray();

对于反序列化,我决定在专用的

JsonDocument.Parse
方法中使用
FromJson(string json)
。在这种特定情况下,这对我来说效果很好。


1
投票

实际上,我最终将列表的定义从

List<Extension>
更改为
List<object>
,并且行为得到了纠正。对于阅读本文的每个人来说,这可能不是一个可行的解决方案,但对我来说很好,所以这就是我添加自己的答案的原因。


0
投票

对于最近遇到此问题的任何人,根据 Microsoft 的这篇文章 System.Text.Json 自 .NET7 起开始支持派生类的序列化。

可以通过在主类中添加属性注解来实现

[JsonDerivedType(typeof(DerivedExtensionA))]
public abstract class Extension
© www.soinside.com 2019 - 2024. All rights reserved.