为什么序列化属性需要序列化属性

时间:2010-06-05 22:33:52

标签: c# .net serialization

根据我的理解,SerializableAttribute不提供编译时检查,因为它们都是在运行时完成的。如果是这种情况,那么为什么要将类标记为可序列化?

序列化程序是否只是尝试序列化一个对象然后失败?这不就是它现在做的吗?当标记某些内容时,它会尝试并失败。如果你必须将事物标记为不可序列化而不是可序列化,那不是更好吗?这样你就不会有库不将事物标记为可序列化的问题吗?

2 个答案:

答案 0 :(得分:40)

据我了解,SerializableAttribute背后的想法是为二进制序列化创建一个选择加入系统。

请记住,与使用公共属性的XML序列化不同,二进制序列化默认会抓取所有私有字段。

这不仅包括操作系统结构和不应公开的私有数据,而且反序列化它可能导致可能导致应用程序崩溃的损坏状态(愚蠢的例子:一个句柄用于文件在另一台计算机上打开。)

答案 1 :(得分:20)

这只是BinaryFormatter(和SOAP等价物,但没有人使用它)的要求。迭戈是对的;从它的作用来看,这有很好的理由,但它只是唯一的选择 - 事实上,我个人推荐BinaryFormatter进行交谈AppDomains - (IMO)是持久化数据(到磁盘,缓存,数据库BLOB等)的好方法。

如果此行为导致您遇到麻烦,请考虑使用以下任何替代方法:

  • XmlSerializer,适用于公共成员(不仅仅是字段),但需要公共无参数构造函数和公共类型
  • DataContractSerializer可以完全选择加入(使用[DataContract] / [DataMember]),但也可以(在3.5及以上版本中)而是字段

另外 - 对于第三方选项(我是第三方); protobuf-net可能有选择; “v2”(尚未完全发布,但作为源提供)允许模型(序列化成员等)独立于类型进行描述,以便它可以应用于您无法控制的类型。与BinaryFormatter不同,输出是版本容忍的,已知的公共格式等。