【问题标题】:Removing default constructor used by YamlDotNet删除 YamlDotNet 使用的默认构造函数
【发布时间】:2017-05-10 21:48:36
【问题描述】:

我有一个包含各种类型节点的对象图。所有节点都派生自一个 Node 类。使用 YamlDotNet,我通过提供我自己的 IObjectFactory 实现,成功地序列化和反序列化图形。唯一剩下要做的就是摆脱只为取悦 YamlDotNet 序列化程序而存在的构造函数。

看看下面的 .NET fiddle https://dotnetfiddle.net/KJMzxD

FancyNode.ctor() 是我想删除的构造函数,但我不确定如何告诉序列化程序我已经处理了反序列化程序中的所有内容。如果我只是删除它,我会收到以下错误

类型“FancyNode”无法反序列化,因为它没有默认构造函数或类型转换器。

【问题讨论】:

    标签: c# serialization default-constructor yamldotnet


    【解决方案1】:

    如果您只想摆脱无参数构造函数代码而不是构造函数本身 - 鉴于这种类型的反序列化需要它 - 您可以删除这两个构造函数并使用工厂方法来创建节点。这将导致该类具有默认的公共构造函数。

    例如,改变:

    public class FancyNode : Node
    {
      private IController controller;
    
      public string ID
      {
          get;
          private set;
      }
    
      // I would really like to get rid of this constructor
      public FancyNode()
      {
          throw new NotSupportedException();
      }
    
      // NOTICE: no default constructor here  
      public FancyNode(IController controller, string id)
      {
          this.controller = controller;
          this.ID = id;
      }
    }
    

    到:

    public class FancyNode : Node
    {
        private IController controller;
    
        public string ID
        {
            get;
            private set;
        }
    
        public static FancyNode CreateNode(IController controller, string id)
        {
            var node = new FancyNode();
            node.controller = controller;
            node.ID = id;
            return node;
        }
    }
    

    是的,您失去了严格的控制,不允许在不传递这些参数的情况下创建对象,因为现在任何人都可以执行var x = new FancyNode()。再说一次,您没有验证参数,因此使用new FancyNode(null, null) 调用它没有区别。

    【讨论】:

    • 好主意,但是我不只是想从代码中删除构造函数,我根本不想要默认构造函数。我希望 YamlDotNet 在未正确配置时失败,而不仅仅是默认为默认构造函数认为它就足够了。
    猜你喜欢
    • 2013-08-19
    • 2019-05-07
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 2016-01-01
    • 1970-01-01
    • 2016-09-11
    • 1970-01-01
    相关资源
    最近更新 更多