强制仅从Serialization调用的构造函数

时间:2011-07-19 09:18:30

标签: c# constructor xml-serialization

在我们的代码库中,任何需要保存的类都是IXmlSerializable,这意味着它们都具有公共无参数构造函数。

问题是,我必须在每个上面添加一条注释“仅用于序列化目的”,因为这些实例上的某些成员是私有的并且是必需的,因此在调用所有“可用”构造函数时都需要。

真正好的方法是说“这个构造函数只能通过序列化代码/程序集调用,否则我会爆炸”。任何人都知道有一个很好的方法来做到这一点?他们只能想到这个就是检查调用堆栈为什么听起来太贵了......

2 个答案:

答案 0 :(得分:2)

怎么样:

    [Obsolete("Is your name XmlSerializer? No, I didn't think so.", true)]
    public Foo() { }

注意:此不会保护您免受反射,或来自where T : new()约束的泛型,但它避免了new Foo()场景的可能性。

答案 1 :(得分:1)

我有另一个解决方案:将你的'私有'构造函数移出你的类,并使用serialization surrogate - 这样你的魔术构造函数将永远不会在序列化之外使用,因为它现在是序列化过程的一部分本身。