zoukankan      html  css  js  c++  java
  • .NET 中的序列化 & 反序列化

    序列化:将对象的状态信息及类型信息,转换为一种易于传输或存储形式(流,即字节序列)的过程。

    下图为序列化过程图示,图片来自微软官方文档:

    反序列化:与序列化相反,将流转换为对象的过程。

    常用的有二进制序列化、XML序列化及JSON序列化三种序列化方式。.NET自身提供了对二进制序列化与XML序列化的支持。我们可以借助第三方库,如Newtonsoft.Json,来实现JSON序列化。

    二进制序列化会将对象的所有属性(即使访问修饰符是private)转换到流中,XML/JSON则只转换访问修饰符为public的属性。在反序列化时,二进制形式不会调用构造函数,可以借助二进制序列化来实现深拷贝。

    XML/JSON序列化不受编程语言限制,C#使用XML/JSON序列化后的数据JAVA可以很容易的按照XML或JSON的格式反序列化得到所需数据。相对而言,二进制序列化则受到编程语言的限制。

    除了上述三种序列化方式外,有些公司推出了自己的序列化框架,如:谷歌的protobuf

    三种实现

    [Serializable]
    public class Person
    {
        public Person()
        {
            Console.WriteLine("ctor");
        }
        
        public Person(int gender)
        {
            _gender = gender;
            Console.WriteLine("ctor with parameter");
        }
        
        private static int TAG = 20;
        private int _gender;
        
        public string Name { set; get; }
        public int Age { set; get; }
    }
    ​
    // 创建对象
    var p = new Person(10)
    {
        Name = "xfh",
        Age = 26
    };

    二进制序列化:

    // 二进制序列化,序列化所有属性及字段(即便是访问级别是private)
    var binaryFormatter = new BinaryFormatter();
    using (var stream = new MemoryStream())
    {
        binaryFormatter.Serialize(stream, p);
        Console.WriteLine(stream.Length);
        stream.Position = 0;
        // 反序列化不会调用构造函数
        var newP = (Person)binaryFormatter.Deserialize(stream);
    }

    XML序列化:

    // xml序列化,目标类型必须具有无参构造函数,只会序列化public属性
    var xmlFormatter = new XmlSerializer(typeof(Person));
    using (var stream = new MemoryStream())
    using (var fs = new FileStream(@"C:UsersxfhDesktopstream.xml", FileMode.OpenOrCreate))
    using (var sr = new StreamReader(stream))
    using (var sw = new StreamWriter(fs))
    {
        // 序列化
        xmlFormatter.Serialize(stream, p);
        stream.Position = 0;
        // 写入XML文件中
        while (sr.EndOfStream == false)
        {
            var content = sr.ReadLine();
            sw.WriteLine(content);
        }
        stream.Position = 0;
        // 反序列化
        var newP3 = (Person)xmlFormatter.Deserialize(stream);
    }

    JSON序列化,借助Newtonsoft.Json来实现:

    // Json序列化,只会序列化public属性
    var pStr = JsonConvert.SerializeObject(p);
    Console.WriteLine(System.Text.Encoding.Default.GetByteCount(pStr));
    var newP2 = JsonConvert.DeserializeObject<Person>(pStr); 

    三张图片

    下面三张图片均来自公众号:码农翻身中的文章——序列化: 一个老家伙的咸鱼翻身,推荐大家阅读(码农翻身中有许多优秀的文章值得阅读)。

    二进制序列化:

     

    XML/JSON序列化:

     

    二进制序列化跨语言解决方案: 

     

    推荐阅读

    Serialization (C#)

    Serialization in .NET

    Stream

    序列化: 一个老家伙的咸鱼翻身

  • 相关阅读:
    C# 反射
    WinForm资源管理器开发(TreeView&ListView)
    枚举——完美立方
    关于考证
    人工智能时代,程序员要不要精通算法?
    程序员需要掌握哪些软技能?
    Android数据解析——JSON
    C# 数组转json
    jQuery跨域调用Web API
    oracle 创建表同时添加注释
  • 原文地址:https://www.cnblogs.com/Cwj-XFH/p/10330671.html
Copyright © 2011-2022 走看看