2010-03-09 10 views
5

chcę serializować zerowalne bool po prostu poprzez przekształcenie go na ciągJak serializować Nullable <bool>?

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

Jaki jest najbardziej odpowiedni ciąg do serializacji wartość zerową jako?

+0

Dziękuję wszystkim za twój wkład! –

+1

Z pewnością jest to: 'true',' false' oraz 'FileNotFound'! (Nod do strony DailyWTF). – Skizz

Odpowiedz

8

Ponieważ bool.ToString() zwraca "True" lub "False", wybrałbym "Null". Chciałbym również przepisać to jako:

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

EDIT: Biorę to z powrotem. bool? .ToString() zwraca pusty ciąg znaków, więc zdecydowałbym się na podstawie tego, co jest wygodniejsze. Jeśli dana osoba musi przeczytać wynik, wówczas "Null" jest lepszym wyborem; jeśli jest to konieczne tylko w kodzie, to pusty ciąg jest w porządku. Jeśli wybierzesz pusty ciąg, będzie to proste:

return b.ToString(); 
2

Wybrałbym pusty ciąg reprezentujący wartość zerową.

2

Jeśli powracasz True/False dla rzeczywistych wartości bool, powinieneś zwrócić Null dla symetrii, w przypadku gdy b jest null.

2

Bądź konsekwentny.

b.ToString() 

zwraca ciągi "true" lub "false". Zatem jeśli zwrócisz -1, to będzie mniej spójne, jeśli faktycznie czytasz zserializowane pliki. Kod deserializacji stanie się również bardziej "brzydki" i mniej czytelny.

Wybrałbym serializować go do łańcucha "unset" (lub coś wzdłuż tych linii) lub ciąg "null". Dopóki nie masz naprawdę surowych wymagań przestrzennych lub naprawdę ogromnych zbiorów danych do serializowania dodatkowych znaków, nie powinno to mieć znaczenia.

8

Dlaczego nie:

b.ToString() 

Jeśli b jest null, wówczas zwraca pusty ciąg. Ponieważ to właśnie powraca framework, użyłbym go jako spójnego. Jest to także użyteczne w przypadku skalarów nullable.

1

Jeśli używasz wbudowanego XmlSerializer można również wykonać następujące czynności, aby szeregować wartości (i zapobiec wielu brzydki niestandardowego kodu serializacji):

[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

Właściwie nie sprawdziłem, czy XmlSerializer poprawnie obsłuży wartość zerową, więc może to być niepotrzebne. – Gord

0

Osobiście nie używać żadnego z powyżej, ale po prostu użyj interfejsu ShouldSerialize. Na przykład:

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