significado - serialize and deserialize c#
Ignorar una propiedad durante la serialización xml pero no durante la deserialización (2)
En C #, ¿cómo puedo hacer que XmlSerializer ignore una propiedad durante la serialización pero no durante la deserialización? (¿O cómo hago lo mismo con Json.net?)
Para evitar que una propiedad se XmlIgnore
, puede agregar el atributo XmlIgnore
:
[XmlIgnore]
public int FooBar {get;set;}
Esto hará que la etiqueta <FooBar>
se omita durante la serialización.
Sin embargo, esto también significa que la etiqueta <FooBar>
se ignorará durante la deserialización.
En mi caso, acepto una serie de elementos del usuario en la solicitud y, para cada elemento, el usuario puede especificar una propiedad de acción si desea agregar, modificar o eliminar el elemento. Deseo utilizar el mismo objeto modelo para las llamadas a listas GET, y no quiero devolver esta propiedad de acción. Espero que este sea un caso bastante común.
Otro caso de uso: digamos que tienes un objeto circular
public class Circle
{
public double Radius { get; set; }
}
y lo modifica para agregar una propiedad de diámetro
public class Circle2
{
public double Diameter { get; set; }
public double Radius { get { return Diameter / 2; } set { Diameter = value*2; } }
}
Es posible que desee serializar solo el diámetro, pero aún así poder deserializar archivos xml en el formato anterior que solo contenga el radio.
Hice mi investigación y no encontré nada, de ahí esta pregunta
Solución : descubrí la solución. Puedo agregar una propiedad ShouldSerialize que siempre devuelve información falsa, en esta documentación de MSDN
(esta solución podría agregarse como una respuesta real si esta pregunta se vuelve a abrir)
Esta es la solución descrita por Manoj:
Si desea suprimir la serialización de una propiedad específica Foo
, pero aún así poder deserializarla, puede agregar un método public bool ShouldSerializeFoo()
que siempre devuelve falso.
Ejemplo:
public class Circle2
{
public double Diameter { get; set; }
public double Radius { get { return Diameter / 2; } set { Diameter = value*2; } }
[System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]
public bool ShouldSerializeRadius() {return false;}
}
Esto hará que el radio no se serialice, pero aún así permita que se deserialice.
Este método tiene que ser público para XMLSerializer para encontrarlo, por lo que para evitar contaminar el espacio de nombres, puede agregar el atributo EditorBrowsable
para ocultarlo del IDE. Lamentablemente, este ocultamiento solo funciona si se hace referencia al ensamblado como una DLL en su proyecto actual, pero no si edita el proyecto real con este código.
Si desea ignorar el elemento en la serialización con XmlSerializer, puede usar XmlAttributeOverrides:
XmlAttributeOverrides overrides = new XmlAttributeOverrides();
XmlAttributes attribs = new XmlAttributes();
attribs.XmlIgnore = true;
attribs.XmlElements.Add(new XmlElementAttribute("YourElementName"));
overrides.Add(typeof(YourClass), "YourElementName", attribs);
XmlSerializer ser = new XmlSerializer(typeof(YourClass), overrides);
ser.Serialize(...