【问题标题】:Does YamlDotNet library support Deserialization into existing object?YamlDotNet 库是否支持反序列化到现有对象?
【发布时间】:2014-12-23 15:50:13
【问题描述】:

YamlDotNet 库是否支持将Deserialization 放入现有对象而不是创建新对象?
我需要它,因为我的对象是通过Dependency Injection 创建的,所以我更喜欢Deserialization 将所有属性填充(重写)到给定对象中的方式。

我没有找到合适的 Deserialization 方法重载。
当然,我知道我可以手动处理YamlMappingNode,但Deserialization 方法的简单性是如此可爱,为每种类型编写一个复制构造函数也不是一种选择。引入具有属性值的中间字典是丑陋的。

另外,我认为它可能是非常需要的功能。

【问题讨论】:

    标签: c# .net yaml yamldotnet


    【解决方案1】:

    虽然SharpYaml 有一个似乎支持反序列化的 ObjectContect.Instance,但它并未在任何公共接口中公开。它在内部用于反序列化内部元素。我已经派生了 SharpYaml 以公开此功能,并允许更新内部对象的属性,而不是完全重置对象。

    分叉版本在https://github.com/PeterDavidson/SharpYaml

    我也提交了一个拉取请求;如果它被主仓库接受,那么我将删除分叉。

    编辑:这现在包含在核心 SharpYaml 中,因此您现在可以使用

    Deserialize<T>(TextReader reader, object existingObject=null)
    

    请注意,这也将允许对现有对象进行部分配置 - 任何已经具有值的属性都将被保留,并且只会更改 yaml 文件中定义的那些属性。将添加任何列表属性。

    【讨论】:

    • 您可以在重写的CreateOrTransformObject 方法中将ObjectContext.Instance 用于继承自ObjectSerializer 的自定义序列化程序。
    • 我现在才看到你的提交Allow Deserialize into an existing object。谢谢你。
    【解决方案2】:

    SharpYaml 有一个属性ObjectContext.Instance,描述为:

    将接收其成员反序列化的对象实例(以防无法创建实例)。

    【讨论】:

      猜你喜欢
      • 2011-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-22
      • 1970-01-01
      相关资源
      最近更新 更多