【问题标题】:Enforce constructor called only from Serialization强制仅从序列化调用的构造函数
【发布时间】:2011-07-19 09:18:29
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# constructor xml-serialization


    【解决方案1】:

    怎么样:

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

    注意:这不会保护您免受反射或具有where T : new() 约束的泛型的影响,但它避免了更可能出现的new Foo() 情况。

    【讨论】:

    • 我相信 xml 序列化会忽略标记为过时的属性。构造函数也一样吗?
    • 这和往常一样非常整洁。谢谢马克:)
    【解决方案2】:

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

    【讨论】:

    • 我确实声明这是 XmlSerialization。我不确定您是否可以将代理与 Xml 一起使用。
    • 你是对的,XmlSerialization 不能使用这种方法,虽然 Data Contracts 可以。对不起。
    猜你喜欢
    • 2012-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-08
    • 1970-01-01
    相关资源
    最近更新 更多