C# 为什么';XmlSerializer是否需要将类型标记为[Serializable]?
在C#中,如果我想用C# 为什么';XmlSerializer是否需要将类型标记为[Serializable]?,c#,xml-serialization,datacontractserializer,C#,Xml Serialization,Datacontractserializer,在C#中,如果我想用XmlSerializer序列化实例,那么对象的类型不必用[Serializable]属性标记。但是,对于其他序列化方法,例如DataContractSerializer,需要将类标记为[Serializable]或[DataContract] 关于序列化要求有什么标准或模式吗?这是因为XmlSerializer只序列化公共字段/属性。其他形式的序列化可以序列化私有数据,这构成了潜在的安全风险,因此您必须使用属性“选择加入”。目前.Net Framework中确实有3种序列化
XmlSerializer
序列化实例,那么对象的类型不必用[Serializable]
属性标记。但是,对于其他序列化方法,例如DataContractSerializer
,需要将类标记为[Serializable]
或[DataContract]
关于序列化要求有什么标准或模式吗?这是因为XmlSerializer只序列化公共字段/属性。其他形式的序列化可以序列化私有数据,这构成了潜在的安全风险,因此您必须使用属性“选择加入”。目前.Net Framework中确实有3种序列化形式
不幸的是,序列化有一个标准的整体模式。所有3个框架都有不同的需求和怪癖 安全不是唯一的问题;简单地说,序列化只对某些类有意义。例如,序列化“连接”几乎不需要snse。连接字符串,当然,但连接本身?不。同样,任何需要非托管指针/句柄的东西都无法很好地序列化。代表们也不是 此外,
XmlSerializer
和DataContractSerializer
(默认情况下)是树序列化程序,而不是图序列化程序-因此任何递归链接(如父级
)都会导致其断开
用序列化程序的首选标记标记类只是一种表示“而且应该有意义”的方式
IIRC,无论是
[XmlSerializer
还是[DataContractSerializer]
都曾经非常严格地要求[Serializable]
,[DataContract]
或[IXmlSerializable]
,但他们最近变得更加自由了。没错,这是一个很好的论据,解释了为什么XmlSerializer也需要属性……没有什么可以阻止你序列化一些没有意义的东西。但我认为安全性是他们不这么做的主要原因。而且,好吧,XmlSerializer从来都不需要任何属性,至少回到.NET 1.1,尽管您始终可以使用各种Xml*属性和IXmlSerializable对其进行控制。常见误解:Xml序列化程序从未需要[Serializable],也从未与[Serializable]关联。[Serializable]属性从未对Xml序列化程序的操作或行为产生任何影响。它们始终是不相关的,除非在人们的心目中!@Cheeso-可能是因为我第一次使用XmlSerializer是通过asmx服务,这是否需要它>AFAIR,SOAP序列化确实需要[Serializable]。但是SOAP序列化与XML序列化非常不同。您可能希望将JavaScriptSerializer添加到该列表中-不同的要求和怪癖,但现在是核心框架的一部分。@Marc,以前没有听说过。将不得不对此进行研究。JP-typo?s/serialization/Serializable。这里的关键点是[Serializable]是对二进制序列化程序有意义的属性,而Xml序列化程序不使用它后者使用,而前者不使用i.IIRC,创建序列化程序是为了支持MarshalByRefObject/.NET远程处理,创建XmlSerializer是为了支持ASMX web服务,创建DataContractSerializer是为了支持WCF,因此存在不一致性:-,使字段/属性仅为序列化目的而公开-这就是安全性ty风险。序列化私有字段没什么坏处