44 votes

DataContract XML sérialisation et attributs XML

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

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

Comme vous pouvez le constater, il existe un attribut "unités". Je ne crois pas que cela soit supporté. Ou ai-je tort?

59voto

Greg Sansom Points 9059

Ceci peut être réalisé, mais vous aurez à remplacer la valeur par défaut sérialiseur par l'application de l' [XmlSerializerFormat] attribut à la DataContract. Bien qu'il peut être fait, cela ne marche pas aussi bien que le défaut de sérialiseur, afin de l'utiliser avec prudence.

La suite de la structure de la classe 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 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>

33voto

marc_s Points 321990

Le sérialiseur de contrat de données utilisé par défaut dans WCF ne prend pas 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, vous devrez la changer.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X