¿Tengo una clase con un int que acepta valores NULL? tipo de datos configurado para serializar como un elemento xml. ¿Hay alguna forma de configurarlo para que el serializador xml no serialice el elemento si el valor es nulo?
Intenté agregar el atributo [System.Xml.Serialization.XmlElement (IsNullable = false)], pero obtengo una excepción de serialización en tiempo de ejecución que dice que hubo un error que refleja el tipo, porque "IsNullable puede no estar configurado en 'falso 'para un tipo que acepta valores NULL. Considere usar el tipo' System.Int32 'o eliminar la propiedad IsNullable del atributo XmlElement ".
[Serializable]
[System.Xml.Serialization.XmlRoot("Score", Namespace = "http://mycomp.com/test/score/v1")]
public class Score
{
private int? iID_m;
...
/// <summary>
///
/// </summary>
public int? ID
{
get
{
return iID_m;
}
set
{
iID_m = value;
}
}
...
}
La clase anterior se serializará para:
<Score xmlns="http://mycomp.com/test/score/v1">
<ID xsi:nil="true" />
</Score>
Pero para los ID que son nulos, no quiero el elemento ID en absoluto, principalmente porque cuando uso OPENXML en MSSQL, devuelve un 0 en lugar de nulo para un elemento que se parece a
fuente
HasValue
a la propiedad.Foo
también tiene unpublic bool FooSpecified {get {...} set {...}}
, entoncesget
se usa para ver si seFoo
debe serializar, yset
se llama al asignar un valorFoo
durante la deserialización.Estoy usando este micropatrón para implementar la serialización anulable:
Esto proporciona la interfaz correcta para el usuario sin compromiso y aún hace lo correcto al serializar.
fuente
Descubrí una solución alternativa utilizando dos propiedades. ¿Un int? propiedad con un atributo XmlIgnore y una propiedad de objeto que se serializa.
fuente
Wow, gracias, esta pregunta / respuesta realmente me ayudó. Yo corazón Stackoverflow.
Hice lo que estás haciendo arriba un poco más genérico. Todo lo que realmente estamos buscando es tener Nullable con un comportamiento de serialización ligeramente diferente. Usé Reflector para construir mi propio Nullable, y agregué algunas cosas aquí y allá para que la serialización XML funcione de la manera que queremos. Parece funcionar bastante bien:
¿Pierde la capacidad de tener a sus miembros como int? y así sucesivamente (tiene que usar Nullable <int> en su lugar) pero aparte de eso, todo el comportamiento permanece igual.
fuente
System.ExecutionEngineException
sobreXmlSerializer.Serialize
de mí.Desafortunadamente, los comportamientos que describe están documentados con precisión como tales en los documentos de XmlElementAttribute.IsNullable.
fuente
Una publicación muy útil ayudó mucho.
Opté por ir con la revisión de Scott al tipo de datos Nullable (Of T), sin embargo, el código publicado todavía serializa el elemento Nullable cuando es Null, aunque sin el atributo "xs: nil = 'true'".
Necesitaba forzar al serializador a eliminar la etiqueta por completo, así que simplemente implementé IXmlSerializable en la estructura (esto está en VB, pero te dan la imagen):
Prefiero este método a usar el patrón (foo) Specified, ya que requiere agregar un montón de propiedades redundantes a mis objetos, mientras que usar el nuevo tipo Nullable solo requiere volver a escribir las propiedades.
fuente