它建议的最佳做法所有的.Net属性应密封,according to Microsoft:
.NET框架类库提供检索自定义属性的方法。默认情况下,这些方法搜索属性继承层次结构;例如System.Attribute.GetCustomAttribute
搜索指定的属性类型或扩展指定属性类型的任何属性类型。密封属性消除了通过继承层次结构的搜索,并且可以提高性能。 [我的重点]
所以[Serializable]
是密封的,因为它更快的.Net反射来检查属性。成本是你不能继承和延伸SerializableAttribute
。
如果您愿意,您可以创建自己的非密封属性(尽管您会得到代码分析警告)。
这会让我们有点困惑,它们适用于哪些类的继承使用了属性。这也可能是最好用一个例子:
[Serializable]
public class A
{
public int SimpleSerialisableProperty { get; set;}
}
public class B : A
{
public C ComplexReferenceProperty { get; set; }
}
[Serializable]
public class D : A
{
public bool AnotherSerialisableProperty { get; set;}
}
你问为什么SerializableAttribute.Inherited = false
,这是为什么:
类A
被标记为[Serializable]
,它是。
但是B
类继承了A
并且使用不可序列化的属性扩展它。如果.Net试图连载B
它会遇到一个错误。
这Inherited = false
告诉,只是因为A
已经被标记为[Serializable]
继承这将是serialisable也并不是每一个类.NET。
Now class D
inherits A
and is serialisable,so it get its own [Serializable]
attribute。
最后,在设计属性方面是延长行为(财产电网漂亮的UI编辑器等)的一个好方法。然而他们在强制执行它是可怕的。如果你需要你的客户以特定的方式实现他们的实体类,那么abstract
基类或interface
是更好的方法。如果你把它作为一个属性,那么你基本上是让他们知道[Serializable]
是一种你可以处理的选项。
你不需要'serializable'来创建一个可串行化的类。它仅由BinaryFormatter使用。其他序列化器可以愉快地序列化您的类为ex,xmlSerializer,DatacontractSerializer,DatacontractJsonSerializer,JavascriptSerializer等。 –
但我希望我的类从'myObject.getType()。IsSerializable'同时返回'true'。如果您这么认为,请添加您的方法作为答案。 –
你需要什么'myObject.getType()。IsSerializable'。每个类都是可序列化的(与'serializable'属性无关)。 –