Sérialiser la propriété en tant qu’atsortingbut XML dans l’élément

J’ai le cours suivant:

[Serializable] public class SomeModel { [XmlElement("SomeSsortingngElementName")] public ssortingng SomeSsortingng { get; set; } [XmlElement("SomeInfoElementName")] public int SomeInfo { get; set; } } 

Qui (rempli avec des données de test) et sérialisé à l’aide de XmlSerializer.Serialize () génère le code XML suivant:

  testData 5  

Ce que je dois avoir c’est:

     

Existe-t-il un moyen de spécifier cela comme des atsortingbuts sans écrire mon propre code de sérialisation personnalisé?

Vous aurez besoin de classes wrapper:

 public class SomeIntInfo { [XmlAtsortingbute] public int Value { get; set; } } public class SomeSsortingngInfo { [XmlAtsortingbute] public ssortingng Value { get; set; } } public class SomeModel { [XmlElement("SomeSsortingngElementName")] public SomeSsortingngInfo SomeSsortingng { get; set; } [XmlElement("SomeInfoElementName")] public SomeIntInfo SomeInfo { get; set; } } 

ou une approche plus générique si vous préférez:

 public class SomeInfo { [XmlAtsortingbute] public T Value { get; set; } } public class SomeModel { [XmlElement("SomeSsortingngElementName")] public SomeInfo SomeSsortingng { get; set; } [XmlElement("SomeInfoElementName")] public SomeInfo SomeInfo { get; set; } } 

Et alors:

 class Program { static void Main() { var model = new SomeModel { SomeSsortingng = new SomeInfo { Value = "testData" }, SomeInfo = new SomeInfo { Value = 5 } }; var serializer = new XmlSerializer(model.GetType()); serializer.Serialize(Console.Out, model); } } 

produira:

      

En XmlAtsortingbute sorte, utilisez le XmlAtsortingbute au lieu de XmlElement , mais cela ne ressemblera pas à ce que vous voulez. Cela ressemblera à ceci:

   

La seule façon dont je peux penser pour obtenir ce que vous voulez (en mode natif) serait d’avoir des propriétés pointant sur des objects nommés SomeSsortingngElementName et SomeInfoElementName où la classe contient un seul getter nommé “value”. Vous pouvez aller plus loin et utiliser DataContractSerializer pour que les classes du wrapper puissent être privées. XmlSerializer ne lira pas les propriétés privées.

 // TODO: make the class generic so that an int or ssortingng can be used. [Serializable] public class SerializationClass { public SerializationClass(ssortingng value) { this.Value = value; } [XmlAtsortingbute("value")] public ssortingng Value { get; } } [Serializable] public class SomeModel { [XmlIgnore] public ssortingng SomeSsortingng { get; set; } [XmlIgnore] public int SomeInfo { get; set; } [XmlElement] public SerializationClass SomeSsortingngElementName { get { return new SerializationClass(this.SomeSsortingng); } } }