Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.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
.net 与SerializableAttribute相比,使用DataContractAttribute有什么优势?_.net_Wcf_Serialization_Attributes_Datacontract - Fatal编程技术网

.net 与SerializableAttribute相比,使用DataContractAttribute有什么优势?

.net 与SerializableAttribute相比,使用DataContractAttribute有什么优势?,.net,wcf,serialization,attributes,datacontract,.net,Wcf,Serialization,Attributes,Datacontract,我发现,当涉及的数据类型没有[DataContract],而是[Serializable]时,我的WCF服务工作正常 但是所有的WCF教程都显示了第一个而不是后一个。为什么?DataContractAttribute使您能够更好地控制通过线路发送的内容,因此您可以选择只发送给定实体的必要字段。Serializable使用平台序列化,它假定.NET和两端类型的相同(或类似)版本-它(通常)序列化所有私有成员、状态等。DC用于轻量级XML ish表示,您可以对其进行一些控制,XmlSerialize

我发现,当涉及的数据类型没有
[DataContract]
,而是
[Serializable]
时,我的WCF服务工作正常


但是所有的WCF教程都显示了第一个而不是后一个。为什么?

DataContractAttribute使您能够更好地控制通过线路发送的内容,因此您可以选择只发送给定实体的必要字段。Serializable使用平台序列化,它假定.NET和两端类型的相同(或类似)版本-它(通常)序列化所有私有成员、状态等。DC用于轻量级XML ish表示,您可以对其进行一些控制,XmlSerializer是一种XML格式,您可以很好地控制它(属性数据等)

一个优点是DataContract序列化程序比旧的XmlSerializer快得多


编辑:示例将显示[DataContract]属性,因为它是为WCF使用的DataContractSerializer设计的属性。

仅用[DataContract]标记类是不够的,还必须用[DataMember]修饰要序列化的字段


数据协定是一种序列化的“opt-in”模型,其中XML序列化器是“opt-out”。

实际上,XML序列化器为您提供了更多选项,让您可以选择如何跨线表示数据。数据契约序列化程序的最大优势是速度,但它是以灵活性为代价的。实际上,数据契约几乎无法控制有线格式。通过实现ISerializable,您可以像使用DataContract一样控制序列化。但是使用XmlSerializer(我不能从OP的问题中真正分辨出来)可以提供更多的控制。但是正如Doug提到的,DataContract的速度快了很多,这是它的主要优点。您无法获得XML序列化程序的灵活性,但数据契约序列化程序提供给您的99%的时间已经足够好了。可以在不使用XmlSerializer格式的情况下将类型标记为[Serializable]。Josh:True,但是如果将其标记为Serializable,则WCF将使用XML序列化程序,除非您使用自定义行为对其进行更改。