在我的脑海里,我总是遇到以下问题,在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)
这将彻底滥用这个让我颤抖的功能.
有没有什么常见的方式我不知道要处理这个问题,还是只是我首先对此感到恼火?
如果您的类位于类库中,并且序列化发生在类库本身中,则您可以创建一个internal公开序列化构造函数的包装类(派生自原始类)。通过这种方式,您可以确保外部没有任何内容调用该构造函数。使用这种方法,您必须在反序列化时使用该包装器类型。
当然,这仍然意味着可以从类库内部调用构造函数,但它可以防止大多数意外使用。