C# 正在删除YamlDotNet使用的默认构造函数

C# 正在删除YamlDotNet使用的默认构造函数,c#,serialization,default-constructor,yamldotnet,C#,Serialization,Default Constructor,Yamldotnet,我有一个包含各种类型节点的对象图。所有节点都派生自一个节点类。使用YamlDotNet,我通过提供自己的IObjectFactory实现,成功地实现了图形的序列化和反序列化。剩下要做的唯一一件事就是去掉一个只为取悦YamlDotNet序列化程序而存在的构造函数 请看下面的.NETFiddle FancyNode.ctor()是我想要删除的构造函数,但我不确定如何告诉序列化程序我已经处理了反序列化程序中的所有内容。如果我简单地删除它,我会得到以下错误 无法反序列化类型“FancyNode”,因为

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

请看下面的.NETFiddle

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

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


如果您只想删除无参数构造函数代码,而不是构造函数本身(考虑到这种类型的反序列化需要它),那么您可以删除这两个构造函数,并使用工厂方法创建节点。这将导致类具有默认的公共构造函数

例如,更改:

致:


是的,如果现在任何人都可以执行
var x=new FancyNode()
,那么您将失去严格的控制,即不允许在不传入这些参数的情况下创建对象。然后再次说明,您没有验证参数,因此使用
new FancyNode(null,null)
调用它没有什么区别

好主意,但是我不想从代码中删除构造函数,我根本不想要默认的构造函数。我希望YamlDotNet在未正确配置时失败,而不仅仅是默认为默认构造函数,这样就足够了。
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;
    }
}