DataContract XML序列化和XML属性

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

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

正如你可能看到有“单位”属性。 我不相信这是支持的。 还是我错了?

这可以实现,但是您必须通过将[XmlSerializerFormat]属性应用于DataContract来覆盖默认序列化程序。 尽pipe可以这样做,但这并不像默认的序列化器那样好,所以请谨慎使用它。

以下class级结构会给你你后来的结果:

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

你可以用下面的代码来testing它:

 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> 

由于性能方面的原因,默认情况下WCF中使用的数据协定序列化程序支持XML属性(DCS平均比XML序列化程序快大约10%)。

所以,如果你真的想使用DCS,你不能使用这个结构 – 它必须改变。

或者您需要使用带有WCF的XmlSerializer,正如Greg在回答中所表明的那样 – 也适用,但是您失去了DCS的性能优势(加上所有其他优势)。