2010-03-09 24 views
5

quiero serializar un bool anulable simplemente mediante la conversión a una cadena¿Cómo serializar Nullable <bool>?

public static string SerializeNullableBoolean(bool? b) 
{ 
    if (b == null) 
    { 
     return "null or -1 or .."; // What to return here? 
    } 
    else 
    { 
     return b.ToString(); 
    } 
} 

Cuál es la cadena más adecuada para serializar el nulo valor como?

+0

¡Gracias a todos por su participación! –

+1

Seguramente es: 'true',' false' y 'FileNotFound'! (Diríjase al sitio de DailyWTF). – Skizz

Respuesta

8

Dado que bool.ToString() devuelve "Verdadero" o "Falso", iría con "Nulo". También reescribiría esto como:

return b.HasValue ? b.ToString() : "Null"; 

Editar: Retiro eso. bool? .ToString() devuelve una cadena vacía, por lo que decidiría en función de lo que sea más conveniente. Si una persona necesita leer la salida, entonces "Nulo" es una mejor opción; si solo necesita usarse en el código, la cadena vacía está bien. Si va con una cadena vacía, es tan simple como:

return b.ToString(); 
2

Elegiría una cadena vacía para representar el valor nulo.

2

Si devuelve True/False para valores reales bool, debe devolver Null por simetría en caso de que b sea .

2

Sea consistente.

b.ToString() 

devuelve las cadenas 'verdadero' o 'falso'. Por lo tanto, si devuelve -1, será menos consistente si realmente lee los archivos serializados. El código de deserialización también se volverá más "feo" y menos legible.

Yo elegiría serializarlo ya sea en la cadena 'unset' (o algo así) o en la cadena 'null'. A menos que tenga requisitos de espacio realmente estrictos o conjuntos de datos realmente grandes para serializar los caracteres adicionales en realidad no deberían importar.

8

Por qué no:

b.ToString() 

Si b es nula, entonces se devuelve una cadena vacía. Como eso es lo que devuelve el marco, lo usaría para ser consistente. Esto es también lo que XmlSerializer usa para escalares nulos.

1

Si está utilizando el construido en el XmlSerializer también se puede hacer lo siguiente para serializar el valor (y evitar que una gran cantidad de código de serialización fea costumbre):

[Serializable] 
    public class Foo 
    { 
     [XmlIgnore] 
     public bool? Bar { get; set; } 

     [XmlAttribute("Bar")] 
     [EditorBrowsable(EditorBrowsableState.Never)] 
     public string xmlBar 
     { 
      get { return Bar.ToString(); } 
      set 
      { 
       if (string.IsNullOrEmpty(value)) Bar = null; 
       else Bar = bool.Parse(value); 
      } 
     } 
    } 
+0

En realidad, no verifiqué si el XmlSerializer manejará correctamente un bool que admite valores NULL, por lo que puede que no sea necesario. – Gord

0

Personalmente no utilizar cualquiera de los arriba, pero simplemente use la interfaz ShouldSerialize. Por ejemplo,

[XmlElement("SomeBoolean ", Namespace = "SomeNamespace")] 
public bool? SomeBoolean { get; set; } 
public bool ShouldSerializeSomeBoolean() { return SomeBoolean.HasValue; } 
Cuestiones relacionadas