El uso de decoraciones XML para especificar valores predeterminados durante la serialización de-
-
28-09-2019 - |
Pregunta
Tengo un problema deserializar algunos XML; el XML suministrado por un tercero es bastante detallado, por lo que si no existe un conjunto valor para un elemento particular, se suministrará y elemento vacío (por ejemplo <element1 />
).
Este es un problema para ciertos elementos, por ejemplo, aquellos que están destinados a números enteros de la tienda. Tengo control sobre el tercero, por lo que podría o bien conseguir que especifican un valor predeterminado (<myinteger>0</myinteger>
) o puedo conseguir que se omiten estos elementos en su totalidad. Ambos deben evitar el problema.
Sin embargo, puede haber situaciones en el futuro, en el que no tenemos tanto control - en cuyo caso, ¿hay una forma de especificar, quizás a través de una decoración, un valor por defecto
[XmlElement("myinteger")=0???]
public int MyInteger
{
get
{
return myInteger;
}
set
{
myInteger= value;
}
}
Solución
XmlSerializer
hace [DefaultValue]
apoyo, pero lo utiliza durante serialización . Durante deserialización , simplemente ejecuta el constructor, a continuación, toma valores entrantes y las aplica. Un enfoque común, entonces, es utilizar el constructor (o en el campo-inicializadores):
public Foo() {
Bar = 4;
}
[DefaultValue(4), XmlAttribute("bar")]
public int Bar {get;set;}
No obstante ; La interpretación de XmlSerializer
de esto no es "suministrar un elemento vacío" -, sino más bien "omitir el elemento (/ atributo)". int?
aun no se asigna a "vaciar". Para mango vacío elementos, que tendría que manejarlo como una cadena. ¿Qué es feo.
Otros consejos
Decoración usando [DefaultValue] no parece ser una solución completa, ya que no funciona siempre. Otra solución sencilla (Puede no estar limpio)
public string _sourceSubFolderName;
[DefaultValueAttribute("")]
[XmlElement("SourceSubFolderName")]
public string SourceSubFolderName
{
get { return string.IsNullOrEmpty(_sourceSubFolderName) ?
string.Empty : _sourceSubFolderName; }
set { _sourceSubFolderName = value; }
}