Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么要序列化对象需要Serializable属性_C#_.net_Serialization - Fatal编程技术网

C# 为什么要序列化对象需要Serializable属性

C# 为什么要序列化对象需要Serializable属性,c#,.net,serialization,C#,.net,Serialization,根据我的理解,SerializableAttribute不提供编译时检查,因为它都是在运行时完成的。如果是这样,那么为什么需要将类标记为可序列化 序列化程序不能尝试序列化一个对象然后失败吗?现在不是这样吗?当某物被标记时,它会尝试并失败。如果必须将事物标记为不可序列化而不是可序列化,不是更好吗?这样您就不会有库不将事物标记为可序列化的问题了?据我所知,SerializableAttribute背后的思想是为二进制序列化创建一个选择加入系统 请记住,与使用公共属性的XML序列化不同,二进制序列化默

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


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

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

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


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

这只是
二进制格式化程序的要求(和SOAP等效,但没有人使用它)。Diego是对的;从它的作用来看,这有很好的理由,但它远不是唯一的选择-事实上,我个人只建议
BinaryFormatter
AppDomains
之间进行对话-它不是保存数据的好方法(IMO)(磁盘、缓存、数据库BLOB等)

如果这种行为给你带来麻烦,考虑使用任何替代方案:

  • XmlSerializer
    ,它对公共成员(不仅仅是字段)有效,但需要公共无参数构造函数和公共类型
  • DataContractSerializer
    ,它可以完全选择性地工作(使用
    [DataContract]
    /
    [DataMember]
    ),但也可以(在3.5及更高版本中)对字段工作

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

+1-基本上安全性和非公共信息的公开是这里的问题。唯一的答案解释了为什么二进制序列化需要它。好的job,在所有答案中都遗漏了这一点。太棒了。关于你在c#中序列化的选择及其优缺点的精彩总结。这正是我在上周所寻找的…谢谢Marc。可能重复的你可以尝试使用自动添加所有类的属性。显示了类似的用法在这个问题上: