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

发布于 2024-11-25 03:40:23 字数 244 浏览 1 评论 0原文

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

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

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

In our codebase any classes that need to be saved are IXmlSerializable, this means that they all have public parameterless constructors.

The problem with this, is I have to stick a remark above each one "Only for serialization purposes" because certain members on these instances are private and required, and are therefore required when calling all the 'usable' constructors.

What would be really nice is a way of saying "This constructor must only be called by serialization code/assemblies, otherwise I'm going to explode". Anyone know if there's a nice way to do this? They only way I can think of this is checking the call stack why sounds too expensive...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

遥远的绿洲 2024-12-02 03:40:23

怎么样:

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

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

How about:

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

Note: this won't protect you from reflection, or from generics with the where T : new() constraint, but it avoids the more likely new Foo() scenario.

天涯离梦残月幽梦 2024-12-02 03:40:23

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

I have another solution for you: move your 'private' constructor out of your class, and use a serialization surrogate - that way your magic constructor will never be used outside of serialization as it's now part of the serialization process per se.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文