Как сериализировать Nullable <bool>?

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

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

Что самая соответствующая строка должна сериализировать нулевое значение как?

5
задан abatishchev 1 July 2011 в 15:07
поделиться

6 ответов

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

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

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

return b.ToString();
8
ответ дан 18 December 2019 в 06:50
поделиться

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

b.ToString()

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

8
ответ дан 18 December 2019 в 06:50
поделиться

Если вы используете встроенный 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);
            }
        }
    }
1
ответ дан 18 December 2019 в 06:50
поделиться

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

2
ответ дан 18 December 2019 в 06:50
поделиться

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

2
ответ дан 18 December 2019 в 06:50
поделиться

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

b.ToString()

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

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

2
ответ дан 18 December 2019 в 06:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: