2010-03-09 4 views
5

Voglio serializzare un bool annullabile semplicemente convertirlo in una stringaCome serializzare Nullable <bool>?

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

Qual è la stringa più appropriato per serializzare l'nullo valore come?

+0

Grazie a tutti per il vostro contributo! –

+1

Sicuramente è: 'true',' false' e ​​'FileNotFound'! (Annuisci sul sito DailyWTF). – Skizz

risposta

8

Dal momento che bool.ToString() restituisce "True" o "False", andrei con "Null". Vorrei anche riscriverlo come:

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

Modifica: lo riprendo. bool? .ToString() restituisce una stringa vuota, quindi deciderò in base a ciò che è più conveniente. Se una persona ha bisogno di leggere l'output, allora "Null" è una scelta migliore; se deve essere usato solo nel codice, la stringa vuota va bene. Se si va con stringa vuota è semplice come:

return b.ToString(); 
2

Vorrei scegliere una stringa vuota per rappresentare il valore null.

2

Se si restituisce True/False per i valori reali bool, è necessario restituire Null per simmetria, nel caso in cui b sia null.

2

essere coerenti.

b.ToString() 

restituisce le stringhe "true" o "false". Quindi se restituisci -1 sarà meno coerente se leggi effettivamente i file serializzati. Il codice di deserializzazione diventerà anche più "brutto" e meno leggibile.

Vorrei scegliere di serializzarlo sulla stringa 'unset' (o qualcosa del genere) o sulla stringa 'null'. A meno che non si abbiano requisiti di spazio molto rigidi o set di dati davvero enormi per serializzare i personaggi extra non dovrebbe davvero importare.

8

Perché non:

b.ToString() 

Se b è nullo, allora restituisce una stringa vuota. Poiché questo è ciò che ritorna il framework, lo userei per essere coerente. Questo è anche ciò che XmlSerializer utilizza per scalari nullable.

1

Se si utilizza il costruito nel XmlSerializer è anche possibile effettuare le seguenti operazioni per serializzare il valore (e prevenire un sacco di codice di serializzazione brutto personalizzato):

[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

In realtà non ho verificato se XmlSerializer gestirà correttamente un valore null bool, quindi potrebbe non essere necessario. – Gord

0

Personalmente non vorrei utilizzare uno qualsiasi dei sopra ma semplicemente usa l'interfaccia ShouldSerialize. Per esempio,

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