DataContract XML-сериализация и атрибуты XML - PullRequest
40 голосов
/ 01 февраля 2011

Можно ли десериализовать этот XML в объект, помеченный атрибутом DataContract?

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

Как вы можете видеть, есть атрибут "units".Я не верю, что это поддерживается.Или я не прав?

Ответы [ 2 ]

52 голосов
/ 01 февраля 2011

Этого можно достичь, но вам придется переопределить сериализатор по умолчанию, применив атрибут [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>
26 голосов
/ 01 февраля 2011

Сериализатор контрактов данных, используемый по умолчанию в WCF, не поддерживает атрибуты XML по соображениям производительности (DCS в среднем примерно на 10% быстрее, чем сериализатор XML).

Так что, если вы действительно хотите использовать DCS, вы не можете использовать эту структуру, которая у вас есть, - ее придется изменить.

Или вам нужно использовать XmlSerializer с WCF, как показал Грег в своем ответе, - это тоже работает, но вы теряете выигрыш в производительности (плюс все другие преимущества) DCS.

...