xmlelement serialize serializar net deserialize deserializar c# .net xml xml-serialization

c# - serialize - Serializar la propiedad como atributo XML en el elemento



serialize object c# (2)

Más o menos, usa XmlAttribute lugar de XmlElement , pero no se verá como lo que quieres. Se verá como la siguiente:

<SomeModel SomeStringElementName="testData"> </SomeModel>

La única forma que se me ocurra para lograr lo que quiere (de forma nativa) es tener propiedades que apunten a objetos llamados SomeStringElementName y SomeInfoElementName donde la clase contenga un solo captador llamado "valor". Podría ir un paso más allá y usar DataContractSerializer para que las clases de envoltura puedan ser privadas. XmlSerializer no leerá propiedades privadas.

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

Tengo la siguiente clase:

[Serializable] public class SomeModel { [XmlElement("SomeStringElementName")] public string SomeString { get; set; } [XmlElement("SomeInfoElementName")] public int SomeInfo { get; set; } }

Que (cuando se rellena con algunos datos de prueba) y se serializa utilizando XmlSerializer.Serialize () da como resultado el siguiente XML:

<SomeModel> <SomeStringElementName>testData</SomeStringElementName> <SomeInfoElementName>5</SomeInfoElementName> </SomeModel>

Lo que necesito tener es:

<SomeModel> <SomeStringElementName Value="testData" /> <SomeInfoElementName Value="5" /> </SomeModel>

¿Hay alguna forma de especificar esto como atributos sin escribir mi propio código de serialización personalizado?


Necesitarás clases de envoltura:

public class SomeIntInfo { [XmlAttribute] public int Value { get; set; } } public class SomeStringInfo { [XmlAttribute] public string Value { get; set; } } public class SomeModel { [XmlElement("SomeStringElementName")] public SomeStringInfo SomeString { get; set; } [XmlElement("SomeInfoElementName")] public SomeIntInfo SomeInfo { get; set; } }

O un enfoque más genérico si prefieres:

public class SomeInfo<T> { [XmlAttribute] public T Value { get; set; } } public class SomeModel { [XmlElement("SomeStringElementName")] public SomeInfo<string> SomeString { get; set; } [XmlElement("SomeInfoElementName")] public SomeInfo<int> SomeInfo { get; set; } }

Y entonces:

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

Producirá:

<?xml version="1.0" encoding="ibm850"?> <SomeModel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <SomeStringElementName Value="testData" /> <SomeInfoElementName Value="5" /> </SomeModel>