DataContract XML序列化和XML属性

Sch*_*999 42 c# xml wcf serialization datacontract

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

<root>
<distance units="m">1000</distance>
</root>
Run Code Online (Sandbox Code Playgroud)

您可能会看到有"单位"属性.我不相信这是支持的.还是我错了?

Gre*_*som 54

这可以实现,但您必须通过将[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;
}
Run Code Online (Sandbox Code Playgroud)

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

root mc = new root();
XmlSerializer ser = new XmlSerializer(typeof(root));
StringWriter sw = new StringWriter();
ser.Serialize(sw, mc);
Console.WriteLine(sw.ToString());
Console.ReadKey();
Run Code Online (Sandbox Code Playgroud)

输出将是:

<?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>
Run Code Online (Sandbox Code Playgroud)

  • 如果要查找XmlSerializerFormat属性,可以在System.ServiceModel命名空间中找到它:http://msdn.microsoft.com/en-us/library/system.servicemodel.xmlserializerformatattribute%28v=VS.90%29. ASPX (9认同)
  • @AaronLS 我刚试过这个,它似乎忽略了 DataContact 属性。我尝试设置名称 `[DataMember(Name = "foo")]` 但它没有使用该名称进行序列化,而是使用声明的属性名称。 (2认同)

mar*_*c_s 28

由于性能原因,默认情况下在WCF中使用的Data Contract Serializer 支持XML属性(DCS平均比XML序列化程序快10%).

因此,如果您真的想使用DCS,则无法使用此结构 - 必须进行更改.

或者你需要将XmlSerializer与WCF一起使用,正如Greg在他的回答中所表明的那样 - 这也有效,但你会失去DCS的性能优势(加上所有其他好处).