作为学习WCF的一部分,我正在阅读有关序列化的内容。我很难理解如何在.NET 3.5中控制序列化。例如,我有一个带有一些公共属性的简单类。例如,通过向该类添加DataContract属性,可以在序列化类时控制名称空间和类名。
另一方面,我可以添加可序列化属性(可能甚至不是必要的)和XmlType属性,这也允许我控制名称空间和用于序列化类的名称。
我实现了这两种方法,并在ServiceContract中使用该类作为接口调用的一部分。然后,我使用Http分析器来查看各种对象是如何被服务器化的,并且我注意到XmlType根本没有影响http中的xml。
我一整天都在努力理解这一点。我遗漏了什么?
更新:我确实理解两者之间的区别以及它们存在的原因。我只是不明白为什么我不能用XmlType来影响生成的xml,或者(刚刚尝试了XmlRoot)。
基本上,您可以通过实现IXmlSerializable来控制序列化的所有细节,但名称空间和顶级元素的名称除外。为此,我假设您需要XmlType或XmlRoot属性。我错了吗?
发布于 2009-03-08 19:25:17
DataContractSerializer的要点是不控制序列化的细节。相反,我们的想法是将数据序列化为一个可以被最多的客户端使用的表单。
与其关注模式的细节,不如用要发送和接收的数据成员来定义数据契约。这是对数据的非常抽象的描述。它被序列化成一种非常简单的格式,反映了抽象的描述。
只有当您绝对需要控制要序列化或反序列化的XML的详细信息时,才应该使用XML序列化程序。当您不需要那么多的控制时,请继续使用数据契约序列化程序。
发布于 2009-03-08 19:13:29
见XmlSerializer与DataContractSerializer: Wcf中的序列化。
编辑
见使用.NET XML属性自定义.NET对象XML序列化。让您的数据序列化为您首先想要的表单。然后放置XmlSerializerFormat属性。
[ServiceContract]
[XmlSerializerFormat]
public interface MyService
{
[OperationContract]
[XmlSerializerFormat]
void MyMethod();
}发布于 2009-03-09 05:42:10
澄清点:可序列化属性与XmlSerialization无关。可序列化属性与Runtime.Serialization有关。很困惑,是的。
.NET中有太多的序列化程序。
https://stackoverflow.com/questions/624111
复制相似问题