web-dev-qa-db-fra.com

Sérialisation XML DataContract et attributs XML

Est-il possible de désérialiser ce XML en un objet marqué avec l'attribut DataContract?

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

Comme vous pouvez le voir, il existe un attribut "unités". Je ne pense pas que ce soit soutenu. Ou ai-je tort?

41
Schultz9999

Cela peut être réalisé, mais vous devrez remplacer le sérialiseur par défaut en appliquant le [XmlSerializerFormat] attribut au DataContract. Bien que cela puisse être fait, cela ne fonctionne pas aussi bien que le sérialiseur par défaut, alors utilisez-le avec prudence.

La structure de classe suivante vous donnera le résultat que vous recherchez:

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

Vous pouvez tester cela avec le code suivant:

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

La sortie sera:

<?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>
53
Greg Sansom

Le sérialiseur de contrat de données utilisé par défaut dans WCF ne pas prend en charge les attributs XML pour des raisons de performances (le DCS est environ 10% plus rapide en moyenne que le sérialiseur XML).

Donc, si vous voulez vraiment utiliser le DCS, vous ne pouvez pas utiliser cette structure que vous avez - il faudrait la changer.

Ou vous devez utiliser le XmlSerializer avec WCF, comme Greg l'a montré dans sa réponse - cela fonctionne aussi, mais vous perdez les performances (plus tous les autres avantages) du DCS.

26
marc_s