Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.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# 为什么';XmlSerializer是否需要将类型标记为[Serializable]?_C#_Xml Serialization_Datacontractserializer - Fatal编程技术网

C# 为什么';XmlSerializer是否需要将类型标记为[Serializable]?

C# 为什么';XmlSerializer是否需要将类型标记为[Serializable]?,c#,xml-serialization,datacontractserializer,C#,Xml Serialization,Datacontractserializer,在C#中,如果我想用XmlSerializer序列化实例,那么对象的类型不必用[Serializable]属性标记。但是,对于其他序列化方法,例如DataContractSerializer,需要将类标记为[Serializable]或[DataContract] 关于序列化要求有什么标准或模式吗?这是因为XmlSerializer只序列化公共字段/属性。其他形式的序列化可以序列化私有数据,这构成了潜在的安全风险,因此您必须使用属性“选择加入”。目前.Net Framework中确实有3种序列化

在C#中,如果我想用
XmlSerializer
序列化实例,那么对象的类型不必用
[Serializable]
属性标记。但是,对于其他序列化方法,例如
DataContractSerializer
,需要将类标记为
[Serializable]
[DataContract]


关于序列化要求有什么标准或模式吗?

这是因为XmlSerializer只序列化公共字段/属性。其他形式的序列化可以序列化私有数据,这构成了潜在的安全风险,因此您必须使用属性“选择加入”。

目前.Net Framework中确实有3种序列化形式

  • XmlSerialization—默认情况下,它适用于公共字段和属性。仍然可以通过XmlElementAttribute、XmlAttributeAttribute等进行控制
  • BinarySerialization-由SerializationAttribute控制。深入集成到CLR中
  • WCF序列化-DataContractAttribute等

  • 不幸的是,序列化有一个标准的整体模式。所有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风险。序列化私有字段没什么坏处