我有一个包含各种类型节点的对象图。所有节点都派生自Node类。使用YamlDotNet我通过提供自己的IObjectFactory
实现设法对图表进行序列化和反序列化。剩下要做的唯一事情就是摆脱仅存在的构造函数来取悦YamlDotNet序列化程序。
看看下面的.NET小提琴 https://dotnetfiddle.net/KJMzxD
FancyNode.ctor()
是我想删除的构造函数,但我不知道如何告诉序列化程序我已经处理了解串器中的所有内容。如果我只是删除它,我会收到以下错误
输入' FancyNode'无法反序列化,因为它没有默认构造函数或类型转换器。
答案 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)
调用它没有任何区别。