2010-06-05 92 views
33

基于我的理解,SerializableAttribute不提供编译时检查,因为它全部在运行时完成。如果是这样的话,为什么需要将类标记为可序列化?为什么序列化对象需要序列化

序列化程序不能尝试序列化一个对象,然后失败吗?这不正是它现在所做的吗?当某些东西被标记时,它会尝试并失败。如果你必须将事物标记为不可序列化而不是可序列化,这会不会更好?这样你就不会有库不把事情标记为可序列化的问题了?

+0

可能重复[为什么你必须标记与属性的类\ [序列化\]](http://stackoverflow.com/问题/ 2595104 /为什么-DO-你具备对标记A级与 - 该属性可序列化) – nawfal 2014-07-10 09:57:06

+0

你可以尝试自动添加属性使用[postsharp(HTTPS所有的类:// www.postsharp.net/)。类似的应用显示在这个问题:http://stackoverflow.com/questions/7851365/how-to-inject-an-attribute-using-a-postsharp-attribute – 2016-02-17 17:51:37

回答

34

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

请记住,与使用公共属性的XML序列化不同,二进制序列化在默认情况下捕获所有私有字段。

这不仅可能包括操作系统结构和私有数据是不应该被曝光,但反序列化就可能造成损坏的状态可能会崩溃的应用程序(傻例如:文件句柄在开放不同的电脑)。

+1

+1 - 基本上非公安曝光信息是这里的问题。 – TomTom 2010-06-06 07:26:32

+0

只有答案解释了为什么二进制序列化需要它。干得好,在所有的答案中都错过了这一点。 – 2014-10-26 11:22:00

19

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

如果此行为会导致你的麻烦,可以考虑使用任何替代品:

  • XmlSerializer,这对公众成员(不仅仅是场)工作,但需要一个公共的无参数的构造函数和公共型
  • DataContractSerializer,其可以工作完全选择加入(使用[DataContract]/[DataMember]),但其也可以(在3.5以上)针对的字段工作代替

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

+0

真棒。精彩的总结您在c#中使用它们的优点和缺点进行序列化的选择。正是我最近一周期待的...... Merci Marc。 – Arthis 2012-06-29 12:57:42

相关问题