Я хочу сериализировать nullable bool просто путем преобразования его в строку
public static string SerializeNullableBoolean(bool? b)
{
if (b == null)
{
return "null or -1 or .."; // What to return here?
}
else
{
return b.ToString();
}
}
Что самая соответствующая строка должна сериализировать нулевое значение как?
Поскольку bool.ToString () возвращает «True» или «False», я бы выбрал «Null». Я бы также переписал это как:
return b.HasValue ? b.ToString() : "Null";
Edit: Я беру это обратно. bool? .ToString () возвращает пустую строку, поэтому я бы решил, что удобнее. Если человеку нужно прочитать вывод, то "Null" - лучший выбор; если его нужно использовать только в коде, то пустая строка вполне подойдет. Если вы используете пустую строку, это очень просто:
return b.ToString();
Почему бы и нет:
b.ToString()
Если b равно нулю, то возвращается пустая строка. Поскольку это то, что возвращает фреймворк, я бы использовал его, чтобы быть последовательным. Это также то, что XmlSerializer
использует для скаляров, допускающих значение NULL.
Если вы используете встроенный 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);
}
}
}
Я бы выбрал пустую строку для представления нулевого значения.
Если вы возвращаете True/False для реальных значений bool
, вы должны возвращать Null для симметрии в случае, если b
является null
.
Будьте последовательны.
b.ToString()
возвращает строки «истина» или «ложь». Таким образом, если вы вернете -1, это будет менее согласованным, если вы действительно читаете сериализованные файлы. Код десериализации также станет более «уродливым» и менее читаемым.
Я бы предпочел сериализовать его либо в строку «unset» (или что-то в этом роде), либо в строку «null». Если у вас нет действительно строгих требований к пространству или действительно огромных наборов данных для сериализации дополнительных символов, это не имеет большого значения.