C# 为什么要序列化对象需要Serializable属性
根据我的理解,SerializableAttribute不提供编译时检查,因为它都是在运行时完成的。如果是这样,那么为什么需要将类标记为可序列化C# 为什么要序列化对象需要Serializable属性,c#,.net,serialization,C#,.net,Serialization,根据我的理解,SerializableAttribute不提供编译时检查,因为它都是在运行时完成的。如果是这样,那么为什么需要将类标记为可序列化 序列化程序不能尝试序列化一个对象然后失败吗?现在不是这样吗?当某物被标记时,它会尝试并失败。如果必须将事物标记为不可序列化而不是可序列化,不是更好吗?这样您就不会有库不将事物标记为可序列化的问题了?据我所知,SerializableAttribute背后的思想是为二进制序列化创建一个选择加入系统 请记住,与使用公共属性的XML序列化不同,二进制序列化默
序列化程序不能尝试序列化一个对象然后失败吗?现在不是这样吗?当某物被标记时,它会尝试并失败。如果必须将事物标记为不可序列化而不是可序列化,不是更好吗?这样您就不会有库不将事物标记为可序列化的问题了?据我所知,
SerializableAttribute
背后的思想是为二进制序列化创建一个选择加入系统
请记住,与使用公共属性的XML序列化不同,二进制序列化默认会获取所有私有字段
这不仅可能包括不应该公开的操作系统结构和私有数据,而且反序列化可能会导致损坏状态,从而导致应用程序崩溃(愚蠢的示例:在不同计算机中打开的文件句柄)。这只是
二进制格式化程序的要求(和SOAP等效,但没有人使用它)。Diego是对的;从它的作用来看,这有很好的理由,但它远不是唯一的选择-事实上,我个人只建议BinaryFormatter
在AppDomains
之间进行对话-它不是保存数据的好方法(IMO)(磁盘、缓存、数据库BLOB等)
如果这种行为给你带来麻烦,考虑使用任何替代方案:
XmlSerializer
,它对公共成员(不仅仅是字段)有效,但需要公共无参数构造函数和公共类型
DataContractSerializer
,它可以完全选择性地工作(使用[DataContract]
/[DataMember]
),但也可以(在3.5及更高版本中)对字段工作
另外-对于第三方选项(我是第三方);protobuf net可能在此处有选项;“v2”(尚未完全发布,但可用作源代码)允许模型(哪些成员要序列化,等等)独立于类型进行描述,以便它可以应用于您不控制的类型。并且与BinaryFormatter不同,输出是版本容忍的,已知的公共格式,等等。+1-基本上安全性和非公共信息的公开是这里的问题。唯一的答案解释了为什么二进制序列化需要它。好的job,在所有答案中都遗漏了这一点。太棒了。关于你在c#中序列化的选择及其优缺点的精彩总结。这正是我在上周所寻找的…谢谢Marc。可能重复的你可以尝试使用自动添加所有类的属性。显示了类似的用法在这个问题上: