Как сериализовать Nullable <bool>? - PullRequest
5 голосов
/ 09 марта 2010

Я хочу сериализировать обнуляемый бул просто преобразовав его в строку

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

Какая строка наиболее подходит для сериализации нулевого значения как?

Ответы [ 7 ]

8 голосов
/ 09 марта 2010

Почему бы и нет:

b.ToString()

Если b равно нулю, возвращается пустая строка. Так как это то, что возвращает фреймворк, я бы использовал его, чтобы быть последовательным. Это также то, что XmlSerializer использует для обнуляемых скаляров.

8 голосов
/ 09 марта 2010

Поскольку bool.ToString () возвращает «True» или «False», я бы выбрал «Null». Я также переписал бы это как:

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

Редактировать: Я забираю это обратно. bool? .ToString () возвращает пустую строку, поэтому я бы решил, основываясь на том, что удобнее. Если человеку необходимо прочитать вывод, тогда «Null» - лучший выбор; если это нужно только использовать в коде, тогда пустая строка - это хорошо. Если вы идете с пустой строкой, это так просто:

return b.ToString();
2 голосов
/ 09 марта 2010

Будьте последовательны.

b.ToString()

возвращает строки «истина» или «ложь». Таким образом, если вы вернете -1, это будет менее согласованно, если вы на самом деле читаете сериализованные файлы. Код десериализации также станет более «уродливым» и менее читабельным.

Я бы предпочел сериализовать его в строку «unset» (или что-то в том же духе) или в строку «null». Если у вас нет действительно строгих требований к пространству или действительно огромных наборов данных для сериализации дополнительных символов, это не должно иметь большого значения.

2 голосов
/ 09 марта 2010

Если вы возвращаете True / False для реальных bool значений, вы должны вернуть Null для симметрии в случае, если b равно null.

2 голосов
/ 09 марта 2010

Я бы выбрал пустую строку для представления нулевого значения.

1 голос
/ 09 марта 2010

Если вы используете встроенный XmlSerializer, вы также можете сделать следующее для сериализации значения (и предотвращения появления большого количества уродливого пользовательского кода сериализации):

    [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 голосов
/ 14 февраля 2014

Лично я бы не стал использовать ничего из вышеперечисленного, а просто использовал интерфейс ShouldSerialize. Например,

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