使用XmlSerializer序列化可空属性
使用XmlSerializer可以方便的将对象序列化为xml,实现应用之间的数据交互。但是XmlSerializer却不能很好地序列化类型中的可空字段。
例如,有如下定义的类Person:
[Serializable] [XmlRoot(ElementName = "Person")] public class Person { public string FirstName { get; set; } public string LastName { get; set; } public int? Age { get; set; } } var person = new Person { FirstName = "First", }; person.OutputXml(Console.Out);public static void OutputXml<T>(this T dto, TextWriter textWriter){ var xmlTypeMapping = typeof(T); var serializer = new XmlSerializer(xmlTypeMapping); var xmlns = new XmlSerializerNamespaces(); xmlns.Add(string.Empty, string.Empty); using (var writer = new XmlTextWriter(textWriter) { Formatting = Formatting.Indented }) { serializer.Serialize(writer, dto, xmlns); }}
[Serializable] [XmlRoot(ElementName = "Person")] public class Person { [XmlAttribute] public string FirstName { get; set; } [XmlAttribute] public string LastName { get; set; } [XmlAttribute] public int? Age { get; set; } }
[Serializable] [XmlRoot(ElementName = "Person")] public class Person { public string FirstName { get; set; } public string LastName { get; set; } public int? Age { get; set; } public bool ShouldSerializeAge() { return Age.HasValue; } }
[Serializable] [XmlRoot(ElementName = "Person")] public class Person { [XmlAttribute] public string FirstName { get; set; } [XmlAttribute] public string LastName { get; set; } [XmlIgnore] // (4) public int? Age { get; set; } [XmlAttribute(AttributeName = "Age")] // (1) public string AgeValue { get { // (2) return Age.HasValue ? Age.Value.ToString() : null; } set { int result; // (3) Age = int.TryParse(value, out result) ? result : (int?) null; } } }