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?
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>
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.