【问题标题】:How to deserialize Object with superclass children? [duplicate]如何反序列化具有超类孩子的对象? [复制]
【发布时间】:2020-12-16 06:25:44
【问题描述】:

我正在为https://github.com/13xforever/gvas-converter 开发一个能够解析 UnrealEngine .sav 文件的扩展。 (https://github.com/RagingLightning/gvas-converter/blob/master/GvasFormat/Gvas.cs)

我有三个相关的课程:

public class Gvas:要反序列化的主类,有一个字段public List<UEProperty> Properties = new List<UEProperty>();

public abstract class UEProperty:所有可能的虚幻引擎属性的基类 带有字段string Type 表示当前子类是哪个子类

public class UEStringProperty : UEProperty:扩展 UEProperty 的全功能类,为 String 变体量身定制

当我反序列化 Gvas 对象时:

Gvas data = JsonConverter.DeserialiteObject<Gvas>(<json-string>);

反序列化器尝试多次实例化UEProperty 类以填充Properties 列表并失败,因为该类是抽象的。

如何告诉反序列化器根据Type 的值实例化一个子类(例如,当Type == "StringProperty" 时实例化UEStringProperty)?

【问题讨论】:

    标签: c# json.net unreal-engine4


    【解决方案1】:

    您可能必须使用自定义 JsonSerializer 和自定义 SerializationBinder 而不是 DefaultSerializationBinder 来更好地控制反序列化,而不是依赖于 JsonConverter.DeserializeObject() 的默认行为。

    JsonSerializer 提供比 JsonConverter 更多的控制。为了完全控制,您可以从中派生一个类并覆盖方法。

    您必须这样做的原因是,基本的 JSON 序列化没有足够的类型保真度来往返返回您的自定义类型。 JSON 仅具有对象、属性、数组、字符串、数字等基础知识,

    有关详细信息,请参阅本文。

    https://www.danylkoweb.com/Blog/create-a-custom-json-serialization-binder-to-resolve-derived-types-ON

    文章摘录:

    不幸的是,派生类型的序列化和反序列化 无论您使用哪种序列化程序,都不是直截了当的。一个解法 为 JsonSerializer 正确解析派生类型是使用 TypeNameHandling 并添加一个自定义 JSON 序列化 Binder 从 DefaultSerializationBinder 派生以覆盖 BindToName 和 BindToType。

    【讨论】:

      猜你喜欢
      • 2014-09-17
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 2014-08-14
      • 2017-09-24
      • 1970-01-01
      • 1970-01-01
      • 2012-11-22
      相关资源
      最近更新 更多