常见问题系列(一)对象序列化

对象序列化是非常常见的技术,序列化为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,设置为缩进格式。

 最终效果如下所示:

 

posted @ 2024-03-27 09:31  业荒于嬉  阅读(8)  评论(0编辑  收藏  举报