最近我一直在写一些可序列化的对象,它也处理特定的逻辑并具有特定的生命周期。为了使其正常工作,必须使用适当的构造函数对其进行实例化,该构造函数需要强制参数。但是,出于序列化目的,我还必须添加一个公共默认构造函数。
该对象将由我们的 API 公开可用,并且第 3 方开发人员应该能够实例化和使用它。尽管会有适当的文档说明如何正确操作该对象,但不能保证有人会尝试使用不正确的构造函数——然后遇到麻烦。
我正在寻找一种巧妙的方法来在第 3 方开发人员编写他们的代码时应用一些指导。我想到了这个Obsolete
属性——我可以用适当的注释来注释序列化构造函数作为消息。然后该消息将出现在输出警告中,并将开发人员引导至正确的代码行。此外,Visual Studio 和使用的任何代码检查插件都会适当地突出显示构造函数的用法。
这种方法困扰我的是Obsolete
属性的目的完全不同。它的语义含义是被装饰的项目已被弃用,并且可能会在以后的版本中被删除。在序列化构造函数场景中这是错误的,并且该属性的用法和含义之间会存在差异。更不用说某些开发部门可能启用的“将警告视为错误”选项......
所以,问题是 - 对于这种属性的使用,这是一种可接受的做法吗?是否有任何其他合法和通用的方式来达到相同的效果(通用我的意思是不依赖第 3 方代码检查插件等 - 我不控制谁使用代码以及他们的设置是什么)?
关于下面答案中的评论(这对我仍然有用),我必须澄清我在可继承类上使用受保护的默认构造函数。构造函数用于支持 XML 序列化,但不应用于在业务逻辑中初始化类。继承类应该调用其他一些基本构造函数,编写继承类的开发人员需要知道这一点。尽管如此,如果需要,从该代码派生的开发人员还必须能够为其继承的类启用 XML 序列化。