C# 序列化与反序列化

文章目录


前言

在 C# 编程中,序列化和反序列化是非常重要的概念。序列化是将对象转换为可以存储或传输的格式的过程,而反序列化则是将存储或传输的格式转换回对象的过程。这两个过程在许多应用场景中都非常有用,例如保存对象状态、在网络上传输对象、在不同的应用程序之间共享数据等。

一、序列化的概念和目的

1. 概念

序列化是将对象的状态转换为可以存储或传输的格式的过程。在 C# 中,可以使用多种方式进行序列化,例如使用二进制序列化、XML 序列化或 JSON 序列化等。

2. 目的

  • 数据存储: 将对象的状态保存到文件、数据库或其他存储介质中,以便在以后需要时可以重新加载并恢复对象的状态。
  • 网络传输: 将对象的状态通过网络发送到其他计算机或设备上,以便在接收端可以重新创建对象并恢复其状态。
  • 数据共享: 在不同的应用程序之间共享对象的状态,以便可以在不同的环境中使用相同的数据。

二、反序列化的概念和目的

1. 概念

反序列化是将存储或传输的格式转换回对象的过程。在 C# 中,可以使用与序列化相同的方式进行反序列化,例如使用二进制序列化、XML 序列化或 JSON 序列化等。

2. 目的

  • 数据恢复: 从存储介质中读取序列化的数据,并将其转换回对象的状态,以便可以继续使用对象。
  • 网络接收: 接收通过网络发送的序列化数据,并将其转换回对象的状态,以便可以在本地处理对象。
  • 数据共享: 从其他应用程序接收到共享的序列化数据,并将其转换回对象的状态,以便可以在本地使用相同的数据。

三、C# 中的序列化方法

1. 二进制序列化

使用方法:使用BinaryFormatter类进行二进制序列化。首先,需要在代码中引入System.Runtime.Serialization.Formatters.Binary命名空间。然后,可以创建一个BinaryFormatter对象,并使用Serialize方法将对象序列化为字节流,使用Deserialize方法将字节流反序列化为对象。

csharp 复制代码
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

class Program
{
    static void Main()
    {
        // 创建一个要序列化的对象
        MyClass obj = new MyClass { Name = "John", Age = 30 };

        // 使用二进制序列化将对象序列化为字节流
        using (MemoryStream stream = new MemoryStream())
        {
            BinaryFormatter formatter = new BinaryFormatter();
            formatter.Serialize(stream, obj);

            // 将字节流转换为字节数组
            byte[] data = stream.ToArray();

            // 使用二进制反序列化将字节数组反序列化为对象
            using (MemoryStream stream2 = new MemoryStream(data))
            {
                BinaryFormatter formatter2 = new BinaryFormatter();
                MyClass deserializedObj = (MyClass)formatter2.Deserialize(stream2);

                Console.WriteLine(deserializedObj.Name);
                Console.WriteLine(deserializedObj.Age);
            }
        }
    }
}

[Serializable]
class MyClass
{
    public string Name { get; set; }
    public int Age { get; set; }
}

特点:

二进制序列化是一种高效的序列化方式,可以快速地将对象序列化为字节流,并在需要时快速地将字节流反序列化为对象。

二进制序列化生成的字节流是紧凑的,占用的存储空间较小。

二进制序列化是一种私有序列化方式,只有使用相同的程序集和类型定义才能进行反序列化。

2. XML 序列化

使用方法:使用XmlSerializer类进行 XML 序列化。首先,需要在代码中引入System.Xml.Serialization命名空间。然后,可以创建一个XmlSerializer对象,并使用Serialize方法将对象序列化为 XML 文档,使用Deserialize方法将 XML 文档反序列化为对象。

csharp 复制代码
using System.IO;
using System.Xml.Serialization;

class Program
{
    static void Main()
    {
        // 创建一个要序列化的对象
        MyClass obj = new MyClass { Name = "John", Age = 30 };

        // 使用 XML 序列化将对象序列化为 XML 文档
        using (StringWriter writer = new StringWriter())
        {
            XmlSerializer serializer = new XmlSerializer(typeof(MyClass));
            serializer.Serialize(writer, obj);

            string xml = writer.ToString();

            // 使用 XML 反序列化将 XML 文档反序列化为对象
            using (StringReader reader = new StringReader(xml))
            {
                XmlSerializer serializer2 = new XmlSerializer(typeof(MyClass));
                MyClass deserializedObj = (MyClass)serializer2.Deserialize(reader);

                Console.WriteLine(deserializedObj.Name);
                Console.WriteLine(deserializedObj.Age);
            }
        }
    }
}

[Serializable]
[XmlRoot("MyClass")]
class MyClass
{
    public string Name { get; set; }
    public int Age { get; set; }
}

特点:

XML 序列化生成的 XML 文档是一种人类可读的格式,可以方便地进行查看和编辑。

XML 序列化是一种公开的序列化方式,可以在不同的平台和编程语言之间进行数据交换。

XML 序列化生成的 XML 文档通常比二进制序列化生成的字节流占用更多的存储空间。

3. JSON 序列化

使用方法:使用JsonSerializer类进行 JSON 序列化。首先,需要在代码中引入System.Text.Json命名空间。然后,可以创建一个JsonSerializerOptions对象,并设置序列化选项,例如缩进格式、属性名称大小写等。最后,可以使用JsonSerializer.Serialize方法将对象序列化为 JSON 字符串,使用JsonSerializer.Deserialize方法将 JSON 字符串反序列化为对象。

csharp 复制代码
using System.Text.Json;

class Program
{
    static void Main()
    {
        // 创建一个要序列化的对象
        MyClass obj = new MyClass { Name = "John", Age = 30 };

        // 使用 JSON 序列化将对象序列化为 JSON 字符串
        string json = JsonSerializer.Serialize(obj);

        // 使用 JSON 反序列化将 JSON 字符串反序列化为对象
        MyClass deserializedObj = JsonSerializer.Deserialize<MyClass>(json);

        Console.WriteLine(deserializedObj.Name);
        Console.WriteLine(deserializedObj.Age);
    }
}

class MyClass
{
    public string Name { get; set; }
    public int Age { get; set; }
}

特点:

JSON 序列化生成的 JSON 字符串是一种轻量级的数据交换格式,占用的存储空间较小,并且易于在不同的平台和编程语言之间进行数据交换。

JSON 序列化是一种人类可读的格式,可以方便地进行查看和编辑。

JSON 序列化可以使用第三方库进行扩展,例如 Newtonsoft.Json,提供更多的功能和选项。

四、总结

序列化和反序列化是 C# 编程中非常重要的概念,可以方便地进行数据存储、网络传输和数据共享等操作。在 C# 中,可以使用二进制序列化、XML 序列化和 JSON 序列化等方式进行序列化和反序列化。

相关推荐
爱写代码的小朋友38 分钟前
华三交换机配置常用命令
运维·服务器·网络
wangjun51591 小时前
jenkins 参数化发布到服务器 publish over ssh、label、Parameterized publishing
服务器·ssh·jenkins
愚润求学1 小时前
【Linux】Linux权限
linux·服务器·语法
低头不见1 小时前
一个服务器算分布式吗,分布式需要几个服务器
运维·服务器·分布式
小爬虫程序猿1 小时前
淘宝商品信息如何存储到数据库?
数据库·爬虫·php
麻芝汤圆1 小时前
使用 MapReduce 进行高效数据清洗:从理论到实践
大数据·linux·服务器·网络·数据库·windows·mapreduce
赋创小助手1 小时前
Gartner预计2025年AI支出达6440亿美元:数据中心与服务器市场的关键驱动与挑战
运维·服务器·人工智能·科技·架构
爱吃奶酪的松鼠丶2 小时前
.net GRPC服务搭建,跨进程调用。C#应用和Python应用之间的通信。
python·c#·.net
靠近彗星2 小时前
如何检查 HBase Master 是否已完成初始化?| 详细排查指南
大数据·数据库·分布式·hbase
郑梓妍2 小时前
ubuntu改用户权限
服务器·网络·数据库