【问题标题】:DataContract XML serialization and XML attributesDataContract XML 序列化和 XML 属性
【发布时间】:2011-06-19 00:44:38
【问题描述】:

是否可以将此 XML 反序列化为标有 DataContract 属性的对象?

<root>
<distance units="m">1000</distance>
</root>

如您所见,有“单位”属性。我不相信这是支持的。还是我错了?

【问题讨论】:

    标签: c# xml wcf serialization datacontract


    【解决方案1】:

    这可以实现,但您必须通过将[XmlSerializerFormat] 属性应用于DataContract 来覆盖默认序列化程序。虽然可以做到,但性能不如默认的序列化器,所以谨慎使用。

    下面的类结构会给你你想要的结果:

    using ...
    using System.Runtime.Serialization;
    using System.ServiceModel;
    using System.Xml.Serialization;
    
    [DataContract]
    [XmlSerializerFormat]
    public class root
    {
       public distance distance=new distance();
    }
    
    [DataContract]
    public class distance
    {
      [DataMember, XmlAttribute]
      public string units="m";
    
      [DataMember, XmlText]
      public int value=1000;
    }
    

    您可以使用以下代码对此进行测试:

    root mc = new root();
    XmlSerializer ser = new XmlSerializer(typeof(root));
    StringWriter sw = new StringWriter();
    ser.Serialize(sw, mc);
    Console.WriteLine(sw.ToString());
    Console.ReadKey();
    

    输出将是:

    <?xml version="1.0" encoding="utf-16"?>
    <root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                                       xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <distance units="m">1000</distance>
    </root>
    

    【讨论】:

    • 如果您正在寻找 XmlSerializerFormat 属性,您可以在 System.ServiceModel 命名空间中找到它:msdn.microsoft.com/en-us/library/…
    • 当然,这适用于编码,我也喜欢阅读文档:)
    • @GregSansom,假设您已经添加了参考。如果您没有解决,则不会显示为选项。
    • @AaronLS 我刚试过这个,它似乎忽略了 DataContact 属性。我尝试设置名称[DataMember(Name = "foo")],但它没有使用该名称进行序列化,而是使用声明的属性名称。
    • @Sinaesthetic 是的,所以如果您使用 Data Contract Serializer,您似乎使用 DataContract/Member 属性来定义结构。如果你使用 XmlSerializer,那么你需要使用 Xml* 属性来定义结构。
    【解决方案2】:

    出于性能原因,WCF 中默认使用的数据协定序列化程序支持 XML 属性(DCS 平均比 XML 序列化程序快 10% 左右)。

    因此,如果您真的想使用 DCS,则不能使用现有的结构 - 必须对其进行更改。

    或者您需要将 XmlSerializer 与 WCF 一起使用,正如 Greg 在他的回答中所展示的那样 - 这也有效,但是您失去了 DCS 的性能优势(以及所有其他优势)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-30
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      • 2012-06-23
      相关资源
      最近更新 更多