删除YamlDotNet使用的默认构造函数

时间:2016-12-26 12:11:48

标签: c# serialization default-constructor yamldotnet

我有一个包含各种类型节点的对象图。所有节点都派生自Node类。使用YamlDotNet我通过提供自己的IObjectFactory实现设法对图表进行序列化和反序列化。剩下要做的唯一事情就是摆脱仅存在的构造函数来取悦YamlDotNet序列化程序。

看看下面的.NET小提琴 https://dotnetfiddle.net/KJMzxD

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

  

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

1 个答案:

答案 0 :(得分:0)

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

例如,更改:

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)调用它没有任何区别。