常见问题系列(一)对象序列化
对象序列化是非常常见的技术,序列化为Xml或者Json字符串,这里记录使用微软内置库序列化为Xml遇到的一个问题。
原始代码:
using System; using System.Collections.Generic; using System.IO; using System.Text; using System.Xml.Serialization; namespace SerializeObject { class Program { static void Main(string[] args) { People people = new People { Name = "叮叮", Pets = new List<Pet> { new Pet{ Category = PetCategory.Cat, NickName = "timi" }, new Pet{ Category = PetCategory.Dog, NickName = "胖虎" } } }; string xmlString = XmlSerialize(people); Console.WriteLine(xmlString); Console.WriteLine("============================华丽的分隔线======================================"); Console.ReadLine(); }
static string XmlSerialize<T>(T t) { using (StringWriter sw = new Utf8StringWriter()) { XmlSerializer xz = new XmlSerializer(t.GetType()); xz.Serialize(sw, t); return sw.ToString(); } } class Utf8StringWriter : StringWriter { public override Encoding Encoding => Encoding.UTF8; } } public class People { public string Name { get; set; } public int? Years { get; set; } public List<Pet> Pets { get; set; } } public enum PetCategory { Cat, Dog, GoldFish } public class Pet { public PetCategory Category { get; set; } public string NickName { get; set; } } }
当对含有可空int类型Years属性值为null的People实例进行序列化时,出现<Years xsi:nil="true" />这样一段内容,xsi:nil="true"用来标记可空的Years属性为null。常规倒是无所谓,但是这里是用于将序列化结果显示为用户查看的,用于记录一些操作日志。
这样的内容给用户看就不太合适了,如何实现不显示xsi:nil="true"这段内容或者直接不序列化Years属性呢?答案是肯定的,通过定义一个ShouldSerializeYears方法,告知微软组件什么时候才序列化这个Years属性即可。
序列化结果如下:
所以个人还是推荐将对象序列化为Json串,占用存储空间小一些。。使用Newtonsoft.Json组件将对象序列化为Json时,Years属性即使为null,会显示为null,序列化结果如下:
如果想实现Years为null,直接不显示这个属性,可以加上前面的ShouldSerializeYears方法。但是Json串像上截图这样显示,不容易看出层级关系,Newtonsoft.Json对此有解决方法,序列化时将Formatting参数设置为Indented,设置为缩进格式。
最终效果如下所示:
本文来自博客园,作者:业荒于嬉,转载请注明原文链接:https://www.cnblogs.com/FreeLoopPowter/p/18097254
如内容对您有所帮助,还请不吝推荐一下!