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

kay*_*one 38 .net c# serialization

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

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

Die*_*hon 42

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

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

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

  • +1 - 基本上安全和非公开信息的曝光是这里的问题. (2认同)

Mar*_*ell 22

这只是BinaryFormatter(和SOAP等效,但没有人使用它)的要求.迭戈是对的; 也有在做什么的条件很好的理由,但它从唯一的选择-事实上,我个人推荐BinaryFormatter用于之间的谈话AppDomains-这是不是(IMO)的好办法坚持数据(到磁盘,缓存,到数据库BLOB等).

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

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

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