.net 使用[Observe]属性来指示开发人员不要使用API的某些部分,这是一种好的做法吗

.net 使用[Observe]属性来指示开发人员不要使用API的某些部分,这是一种好的做法吗,.net,obsolete,code-inspection,.net,Obsolete,Code Inspection,最近我一直在写一些序列化对象,它也处理特定的逻辑,并且具有特定的生命周期。为了使它正常工作,必须使用适当的构造函数实例化它,该构造函数采用强制参数。但是,出于序列化目的,我还必须添加一个公共默认构造函数 该对象将由我们的API公开提供,第三方开发人员应该能够实例化并使用它。尽管会有关于如何正确操作该对象的适当文档,但不能保证有人会尝试使用不正确的构造函数,然后遇到麻烦 我正在寻找一种简洁的方法,在第三方开发人员编写代码时应用一些指导。我想到了过时的属性-我可以用适当的注释作为消息来注释序列化构造

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

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

我正在寻找一种简洁的方法,在第三方开发人员编写代码时应用一些指导。我想到了过时的
属性-我可以用适当的注释作为消息来注释序列化构造函数。然后,该消息将出现在输出警告中,并将开发人员引导到右侧代码行。此外,VisualStudio和使用的任何代码检查附加组件都会适当地突出显示构造函数的用法

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

所以,问题是-对于这种属性的使用,这是一种可接受的做法吗?是否有其他合法和通用的方法来实现相同的效果(通用的意思是不依赖第三方代码检查附加组件等-我不控制谁使用代码以及他们的设置)



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

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

请注意,序列化API具有创建未初始化实例的方法,而根本不使用构造函数(请参见MSDN:)


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

为了澄清反序列化问题,我不是在处理二进制(默认),而是在处理作为.NET framework一部分的XML序列化。它需要无参数构造函数。构造函数不需要是
公共的
,但是如果类要继承并且必须保留序列化功能,那么构造函数至少应该是
受保护的
(当然,除非其他一些构造函数为您工作,但这不是问题所在)。这不完全是同一回事,但是使用[EditorBrowsable(EditorBrowsableState.Never)]会对intellisense隐藏构造函数,以防止开发人员在未检查文档的情况下将其作为建议错误使用。@fsimonazzi,感谢提供有用的信息。同样,没有人可以阻止用户代码访问过时的成员,因此您的建议非常有效,而且更合适。