将无参数构造函数的使用限制为序列化/ Activator/new()

Dbl*_*Dbl 5 c#

在我的脑海里,我总是遇到以下问题,在SO上找不到问题:

如何确保我的默认构造函数用于序列化/激活器,同时确保不鼓励消费者使用它?

在过去,我使用了类似的提示

///<summary>
/// Do not use the default constructor
///</summary>
Run Code Online (Sandbox Code Playgroud)

这显然很容易被忽视,除非你小心地盘旋并检查你使用的每个课程.

虽然我会得到更好的视觉指示,如下所示:

[Obsolete("Do not use the default constructor")]
Run Code Online (Sandbox Code Playgroud)

这将彻底滥用这个让我颤抖的功能.

有没有什么常见的方式我不知道要处理这个问题,还是只是我首先对此感到恼火?

Pat*_*man 4

如果您的类位于类库中,并且序列化发生在类库本身中,则您可以创建一个internal公开序列化构造函数的包装类(派生自原始类)。通过这种方式,您可以确保外部没有任何内容调用该构造函数。使用这种方法,您必须在反序列化时使用该包装器类型。

当然,这仍然意味着可以从类库内部调用构造函数,但它可以防止大多数意外使用。