我有一个对象图,包含各种类型的节点。所有节点都是从Node类派生的。使用YamlDotNet,通过提供自己的IObjectFactory实现,我成功地序列化和反序列化了图形。唯一要做的事情是摆脱仅为取悦YamlDotNet序列化程序而存在的构造函数。
请看下面的.NET fiddle https://dotnetfiddle.net/KJMzxD
FancyNode.ctor()是我想要删除的构造函数,但我不知道如何告诉序列化程序,我已经处理了反序列化器中的所有内容。如果我简单地删除它,我会得到以下错误
类型'FancyNode‘不能反序列化,因为它没有默认的构造函数或类型转换器。
发布于 2016-12-26 13:28:44
如果您只想摆脱无参数构造函数代码,而不是构造函数本身--鉴于这种反序列化是必需的--您可以移除两个构造函数,并使用工厂方法创建节点。这将导致类具有默认的公共构造函数。
例如,更改:
公共类FancyNode :节点{私有IController控制器;公共字符串ID { get;} // i确实希望摆脱此构造函数公共FancyNode() {抛出新的NotSupportedException();} //通知:这里没有默认的构造函数--公共FancyNode(IController控制器,字符串id) { this.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)调用它没有什么区别。
https://stackoverflow.com/questions/41331080
复制相似问题