2016-12-26 79 views
0

我有一个包含各种类型节点的对象图。所有节点都来自一个Node类。使用YamlDotNet我已经设法通过提供我自己的实现IObjectFactory来序列化和反序列化图。剩下的唯一要做的就是摆脱一个只存在取悦YamlDotNet序列化器的构造函数。删除YamlDotNet使用的默认构造函数

看一看以下.NET小提琴 https://dotnetfiddle.net/KJMzxD

FancyNode.ctor()是我想删除的构造函数,但我不知道如何告诉我在解串器处理所有串行。如果我只是删除它,我得到以下错误

类型'FancyNode'不能被反序列化,因为它没有默认的构造函数或类型转换器。

回答

0

如果你只是想摆脱参数的构造函数的代码,而不是构造函数本身的 - 给它需要这种类型的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)调用它没有任何区别。

+0

不错的想法,但是我不想从代码中移除构造函数,我根本不需要默认的构造函数。我想让YamlDotNet在未正确配置时失败,而不仅仅是默认构造函数认为它足够。 –