【发布时间】:2011-06-19 00:44:38
【问题描述】:
是否可以将此 XML 反序列化为标有 DataContract 属性的对象?
<root>
<distance units="m">1000</distance>
</root>
如您所见,有“单位”属性。我不相信这是支持的。还是我错了?
【问题讨论】:
标签: c# xml wcf serialization datacontract
是否可以将此 XML 反序列化为标有 DataContract 属性的对象?
<root>
<distance units="m">1000</distance>
</root>
如您所见,有“单位”属性。我不相信这是支持的。还是我错了?
【问题讨论】:
标签: c# xml wcf serialization datacontract
这可以实现,但您必须通过将[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>
【讨论】:
[DataMember(Name = "foo")],但它没有使用该名称进行序列化,而是使用声明的属性名称。
出于性能原因,WCF 中默认使用的数据协定序列化程序不支持 XML 属性(DCS 平均比 XML 序列化程序快 10% 左右)。
因此,如果您真的想使用 DCS,则不能使用现有的结构 - 必须对其进行更改。
或者您需要将 XmlSerializer 与 WCF 一起使用,正如 Greg 在他的回答中所展示的那样 - 这也有效,但是您失去了 DCS 的性能优势(以及所有其他优势)。
【讨论】: