我有一个名为
Extension
的抽象类,它有几个派生类,例如 DerivedExtensionA
、DerivedExtensionB
等。
现在我有一个定义为
List<Extension>
的列表,其中包含派生类实例。
现在,如果我序列化上面的列表,它只会序列化
Extension
中的基类属性,因为该列表具有基类 Extension
类型。如果我将列表定义为 List<DerivedExtensionA>
,然后仅将 DerivedExtensionA
的实例放入其中,那么它们就可以很好地序列化。但我的代码是通用的,应该接受所有类型的扩展,所以这对我来说不是一个可行的解决方案。
所以问题是..
如何保留定义为
List<Extension>
的列表,并且仍然能够完全序列化包含其所有属性的派生类实例?
这是显示此行为的小提琴:https://dotnetfiddle.net/22mbwb
编辑:更正了小提琴 URL
来自 如何使用 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)
。在这种特定情况下,这对我来说效果很好。
实际上,我最终将列表的定义从
List<Extension>
更改为 List<object>
,并且行为得到了纠正。对于阅读本文的每个人来说,这可能不是一个可行的解决方案,但对我来说很好,所以这就是我添加自己的答案的原因。
对于最近遇到此问题的任何人,根据 Microsoft 的这篇文章 System.Text.Json 自 .NET7 起开始支持派生类的序列化。
可以通过在主类中添加属性注解来实现
[JsonDerivedType(typeof(DerivedExtensionA))]
public abstract class Extension