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