作为尝试学习WCF的一部分,我正在阅读序列化。我正在努力了解如何在.NET 3.5中控制序列化。例如,我有一个带有一些公共属性的简单类。通过将DataContract属性添加到该类,我可以控制命名空间和类序列化时的名称。
另一方面,我可以添加Serializable属性(可能甚至不需要)和XmlType属性,这也允许我控制名称空间和用于序列化类的名称。
我实现了两种方法,并在ServiceContract中使用该类作为接口调用的一部分。然后我使用Http分析器来查看各种对象是如何被serizal化的,我注意到XmlType根本不影响http中的xml。
我一整天都在努力理解这一点。我错过了什么?
更新 我确实理解两者之间的区别以及它们为何存在。我只是不明白为什么我不能用XmlType影响生成的xml或者(只是试过它XmlRoot)。
基本上,您可以通过实现IXmlSerializable来控制序列化的所有细节,除了名称空间和顶级元素的名称。为此,我假设您需要XmlType或XmlRoot属性。我错了吗?
答案 0 :(得分:5)
DataContractSerializer的要点是不控制序列化的细节。相反,我们的想法是将您的数据序列化为可由最大数量的客户端使用的表单。
不是关注模式的细节,而是根据要发送和接收的数据成员定义数据协定。这是一个非常抽象的数据描述。它被序列化为一种非常简单的格式,反映了抽象的描述。
只有在您绝对需要控制要序列化或反序列化的XML的详细信息时,才应使用XML Serializer。当您不需要那么多控制时,请坚持使用Data Contract Serializer。
答案 1 :(得分:2)
澄清点: [Serializable]属性与XmlSerialization无关。 [Serializable]属性与Runtime.Serialization有关。令人困惑,是的。
.NET中有太多的序列化程序。
答案 2 :(得分:1)
请参阅XmlSerializer vs DataContractSerializer: Serialization in Wcf。
修改强>:
见Customize your .NET object XML serialization with .NET XML attributes。将您的数据序列化为您想要的表单。然后输入XmlSerializerFormat
属性。
[ServiceContract]
[XmlSerializerFormat]
public interface MyService
{
[OperationContract]
[XmlSerializerFormat]
void MyMethod();
}
答案 3 :(得分:0)
嗯,DataContractSerializer与XmlSerializer有很多比较。
我想我认为的主要观点是:
DataContract是“选入” - 你需要一个[数据成员]属性明确添加到任何字段或属性(公共,私有,内部或其他)序列化 - 如果你不具备的,它赢得不在那儿。 XmlSerializer将序列化所有公共属性
DataContract允许指定的数据元素的特定顺序 - XmlSerializer的只是使用它们出现在源代码中的顺序
XmlSerializer需要为您的类提供公共的无参数构造函数
在简单的例子,DataContractSerializer的这些优势可能似乎不是很多,真的 - 但它可以是一个明显的优势在更大规模的应用,如果你的数据对象做的不的必须有一个公共的参数无构造函数,并且您不必将“人工”表面元素作为公共属性包含在序列化中。
马克