删除YamlDotNet使用的默认构造函数
问题描述:
我有一个包含各种类型节点的对象图。所有节点都来自一个Node类。使用YamlDotNet我已经设法通过提供我自己的实现IObjectFactory
来序列化和反序列化图。剩下的唯一要做的就是摆脱一个只存在取悦YamlDotNet序列化器的构造函数。删除YamlDotNet使用的默认构造函数
看一看以下.NET小提琴 https://dotnetfiddle.net/KJMzxD
的FancyNode.ctor()
是我想删除的构造函数,但我不知道如何告诉我在解串器处理所有串行。如果我只是删除它,我得到以下错误
类型'FancyNode'不能被反序列化,因为它没有默认的构造函数或类型转换器。
答
如果你只是想摆脱参数的构造函数的代码,而不是构造函数本身的 - 给它需要这种类型的deserialisation的 - 你可以删除这两个构造和使用一个工厂方法来创建节点。这将导致类有一个默认的公共构造函数。
例如,更改:
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在未正确配置时失败,而不仅仅是默认构造函数认为它足够。 –