强制只从序列化调用构造函数

本文关键字:调用 构造函数 序列化 | 更新日期: 2023-09-27 18:02:49

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

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

真正好的方式是说"这个构造函数必须只能由序列化代码/程序集调用,否则我将爆炸"。有人知道有什么好办法吗?我能想到的唯一方法就是检查调用堆栈为什么听起来太贵了…

强制只从序列化调用构造函数

如何:

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

注意:这个不会保护您免受反射或where T : new()约束的泛型的影响,但它可以避免更可能的new Foo()场景。

我为你提供了另一个解决方案:将你的'私有'构造函数移出你的类,并使用序列化代理——这样你的神奇构造函数将永远不会在序列化之外使用,因为它现在是序列化过程本身的一部分。