6

最近我一直在写一些可序列化的对象,它也处理特定的逻辑并具有特定的生命周期。为了使其正常工作,必须使用适当的构造函数对其进行实例化,该构造函数需要强制参数。但是,出于序列化目的,我还必须添加一个公共默认构造函数。

该对象将由我们的 API 公开可用,并且第 3 方开发人员应该能够实例化和使用它。尽管会有适当的文档说明如何正确操作该对象,但不能保证有人会尝试使用不正确的构造函数——然后遇到麻烦。

我正在寻找一种巧妙的方法来在第 3 方开发人员编写他们的代码时应用一些指导。我想到了这个Obsolete属性——我可以用适当的注释来注释序列化构造函数作为消息。然后该消息将出现在输出警告中,并将开发人员引导至正确的代码行。此外,Visual Studio 和使用的任何代码检查插件都会适当地突出显示构造函数的用法。

这种方法困扰我的是Obsolete属性的目的完全不同。它的语义含义是被装饰的项目已被弃用,并且可能会在以后的版本中被删除。在序列化构造函数场景中这是错误的,并且该属性的用法和含义之间会存在差异。更不用说某些开发部门可能启用的“将警告视为错误”选项......

所以,问题是 - 对于这种属性的使用,这是一种可接受的做法吗?是否有任何其他合法和通用的方式来达到相同的效果(通用我的意思是不依赖第 3 方代码检查插件等 - 我不控制谁使用代码以及他们的设置是什么)?


关于下面答案中的评论(这对我仍然有用),我必须澄清我在可继承类上使用受保护的默认构造函数。构造函数用于支持 XML 序列化,但不应用于在业务逻辑中初始化类。继承类应该调用其他一些基本构造函数,编写继承类的开发人员需要知道这一点。尽管如此,如果需要,从该代码派生的开发人员还必须能够为其继承的类启用 XML 序列化。

4

1 回答 1

3

嗯,我认为这不是一个好的解决方案。但是,您真的需要默认构造函数吗?

请注意,序列化 API 具有创建未初始化实例的方法,根本不需要使用构造函数(请参阅 MSDN:FormatterServices.GetUninitializedObject)。

此外,普通的自定义序列化构造函数不是默认构造函数,而是采用 SerializationInfo 和 StreamingContext 的构造函数。如果您有一些自定义序列化,您还可以通过将默认构造函数设置为内部并为执行序列化的程序集应用InternalsVisibleToAttribute来解决您的问题。

于 2013-02-10T14:52:06.610 回答