【问题标题】:DataContract vs. XmlTypeDataContract 与 XmlType
【发布时间】:2010-10-12 01:36:14
【问题描述】:

作为尝试学习 WCF 的一部分,我正在阅读有关序列化的内容。我正在努力理解如何在 .NET 3.5 中控制序列化。例如,我有一个带有一些公共属性的简单类。通过将 DataContract 属性添加到该类,我可以控制命名空间和序列化类的名称。

另一方面,我可以添加 Serializable 属性(可能甚至不需要)和 XmlType 属性,这也允许我控制命名空间和用于序列化类的名称。

我实现了这两种方法,并将 ServiceContract 中的类用作接口调用的一部分。然后我使用 Http 分析器查看各种对象是如何序列化的,我注意到 XmlType 根本没有影响 http 中的 xml。

我整天都在努力理解这一点。我错过了什么?

更新: 我确实了解两者之间的区别以及它们存在的原因。我只是不明白为什么我不能用 XmlType 或(只是尝试了 XmlRoot)影响生成的 xml。

基本上,您可以通过实现 IXmlSerializable 来控制序列化的所有细节,除了命名空间和顶级元素的名称。为此,我假设您需要 XmlType 或 XmlRoot 属性。我错了吗?

【问题讨论】:

标签: .net xml wcf


【解决方案1】:

DataContractSerializer 的重点是控制序列化的细节。相反,我们的想法是将您的数据序列化为可供最多客户端使用的形式。

人们不关心架构的细节,而是根据要发送和接收的数据成员来定义数据契约。它是对数据的非常抽象的描述。它被序列化为一种非常简单的格式,反映了抽象描述。

只有在您绝对需要控制要序列化或反序列化的 XML 细节时才应使用 XML 序列化器。当您不需要那么多控制时,请坚持使用 Data Contract Serializer。

【讨论】:

    【解决方案2】:

    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();
    }
    

    【讨论】:

    • 我今天确实阅读了那篇文章,但它根本没有提到 XmlType 属性。它确实说您可以使用 XmlRoot 属性来更改名称和命名空间,但我也无法让它工作。
    【解决方案3】:

    澄清点: [Serializable] 属性与 XmlSerialization 无关。 [Serializable] 属性与 Runtime.Serialization 有关。令人困惑,是的。

    .NET 中有太多的序列化程序。

    【讨论】:

      【解决方案4】:

      嗯,有很多关于 DataContractSerializer 与 XmlSerializer 的比较。

      我想我认为的要点是:

      • DataContract 是“选择加入” - 您需要将 [DataMember] 属性显式添加到任何字段或属性(公共、私有、内部或其他)以进行序列化 - 如果您没有,它会赢不要在里面。 XmlSerializer 只会序列化所有公共属性

      • DataContract 允许您指定数据元素的特定顺序 - XmlSerializer 只是使用它们在源代码中出现的顺序

      • XmlSerializer 需要一个公共的、无参数的类构造函数

      在简单的示例中,DataContractSerializer 的这些优势可能看起来并不多,实际上 - 但如果您的数据对象不必必须具有公共参数,那么它在更大规模的应用程序中可能是一个明显的优势-less 构造函数,并且您不必为了将它们包含在序列化中而“人为地”将元素表面化为公共属性。

      马克

      【讨论】:

        猜你喜欢
        • 2012-07-16
        • 1970-01-01
        • 2013-10-07
        • 2015-02-05
        • 2011-12-11
        • 1970-01-01
        • 2011-05-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多