2010-03-09 4 views
5

Je veux une sérialisation bool annulable simplement en le convertissant en une chaîneComment sérialiser Nullable <bool>?

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

Quelle est la chaîne la plus appropriée pour sérialiser la valeur NULL?

+0

Merci à tous pour votre contribution! –

+1

Sûrement c'est: 'true',' false' et 'FileNotFound'! (Nod sur le site DailyWTF). – Skizz

Répondre

8

Depuis bool.ToString() retourne "True" ou "False", je voudrais aller avec "Null". Je voudrais également réécrire cela comme:

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

Modifier: Je prends ça en arrière. bool? .ToString() renvoie une chaîne vide, donc je déciderais en fonction de ce qui est le plus pratique. Si une personne a besoin de lire la sortie alors "Null" est un meilleur choix; si seulement il doit être utilisé dans le code, la chaîne vide est correcte. Si vous y allez avec une chaîne vide, il est aussi simple que:

return b.ToString(); 
2

Je choisirais une chaîne vide pour représenter la valeur nulle.

2

Si vous renvoyez Vrai/Faux pour les valeurs réelles bool, vous devez renvoyer Null pour des raisons de symétrie dans le cas où b est null.

2

Soyez cohérent.

b.ToString() 

renvoie les chaînes 'true' ou 'false'. Ainsi, si vous renvoyez -1, il sera moins cohérent si vous lisez réellement les fichiers sérialisés. Le code de désérialisation deviendra également plus «laid» et moins lisible.

Je choisirais de le sérialiser soit avec la chaîne 'unset' (ou quelque chose comme ça) soit avec la chaîne 'null'. À moins que vous ayez des exigences d'espace vraiment strictes ou des ensembles de données vraiment énormes à sérialiser, les caractères supplémentaires ne devraient pas vraiment avoir d'importance.

8

Pourquoi ne pas:

b.ToString() 

Si b est nul, il retourne une chaîne vide. Puisque c'est ce que le cadre renvoie, je l'utiliserais pour être cohérent. C'est aussi ce que XmlSerializer utilise pour les scalaires Nullable.

1

Si vous utilisez le haut dans XmlSerializer, vous pouvez également effectuer les opérations suivantes pour sérialiser la valeur (et éviter beaucoup de code de sérialisation personnalisé laid):

[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 fait, je n'ai pas vérifié pour voir si le XmlSerializer gérera correctement un bool Nullable, donc ceci peut être inutile. – Gord

0

Personnellement, je ne voudrais pas utiliser l'un des ci-dessus mais utilisez simplement l'interface ShouldSerialize. Par exemple,

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