C#中的序列化与反序列化方式

 更新时间:2024年12月16日 16:15:18   作者:呆呆小雅  
本文介绍了C#中的序列化和反序列化概念、目的及其在不同场景中的应用,文章详细讲解了二进制序列化、XML序列化和JSON序列化的方法和特点,并提供了一些示例代码

前言

在 C# 编程中,序列化和反序列化是非常重要的概念。

序列化是将对象转换为可以存储或传输的格式的过程,而反序列化则是将存储或传输的格式转换回对象的过程。

这两个过程在许多应用场景中都非常有用,例如保存对象状态、在网络上传输对象、在不同的应用程序之间共享数据等。

一、序列化的概念和目的

1. 概念

序列化是将对象的状态转换为可以存储或传输的格式的过程。

在 C# 中,可以使用多种方式进行序列化,例如使用二进制序列化、XML 序列化或 JSON 序列化等。

2. 目的

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

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

1. 概念

反序列化是将存储或传输的格式转换回对象的过程。

在 C# 中,可以使用与序列化相同的方式进行反序列化,例如使用二进制序列化、XML 序列化或 JSON 序列化等。

2. 目的

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

三、C# 中的序列化方法

1. 二进制序列化

使用方法:使用BinaryFormatter类进行二进制序列化。

首先,需要在代码中引入System.Runtime.Serialization.Formatters.Binary命名空间。

然后,可以创建一个BinaryFormatter对象,并使用Serialize方法将对象序列化为字节流,使用Deserialize方法将字节流反序列化为对象。

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 文档反序列化为对象。

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 字符串反序列化为对象。

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 序列化等方式进行序列化和反序列化。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • C# yield关键字详解

    C# yield关键字详解

    这篇文章主要介绍了C# yield关键字详解,本文讲解了yield是一个语法糖、语法糖的实现(实现IEnumerable<T>接口的类)、yield使用中的特殊情况等内容,需要的朋友可以参考下
    2015-04-04
  • WPF实现类似360安全卫士界面的程序源码分享

    WPF实现类似360安全卫士界面的程序源码分享

    最近在网上看到了新版的360安全卫士,感觉界面还不错,于是用WPF制作了一个,时间有限,一些具体的控件没有制作,用图片代替了。感兴趣的朋友一起跟着小编学习WPF实现类似360安全卫士界面的程序源码分享
    2015-09-09
  • 获取字符串中的汉字拼音首字母

    获取字符串中的汉字拼音首字母

    获取字符串中的汉字拼音首字母...
    2007-03-03
  • C# 批量生成随机密码必须包含数字和字母并用加密算法加密

    C# 批量生成随机密码必须包含数字和字母并用加密算法加密

    这篇文章主要介绍了C# 批量生成随机密码必须包含数字和字母并用加密算法加密,需要的朋友参考下
    2017-01-01
  • C#实现语音播报功能

    C#实现语音播报功能

    这篇文章主要为大家详细介绍了C#实现语音播报功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • C#通过反射创建自定义泛型

    C#通过反射创建自定义泛型

    这篇文章主要介绍了C#通过反射创建自定义泛型的方法,需要的朋友可以参考下
    2014-08-08
  • 详解C# 泛型中的数据类型判定与转换

    详解C# 泛型中的数据类型判定与转换

    这篇文章主要介绍了C# 泛型中的数据类型判定与转换,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • C#实现简单的loading提示控件实例代码

    C#实现简单的loading提示控件实例代码

    本文通过实例代码给大家介绍了C#实现简单的loading提示控件功能,代码非常简单,具有参考借鉴价值,需要的朋友参考下吧
    2017-09-09
  • C# List实现行转列的通用方案

    C# List实现行转列的通用方案

    本篇通过行转列引出了System.Linq.Dynamic,并且介绍了过滤功能,具有很好的参考价值。下面跟着小编一起来看下吧
    2017-03-03
  • C#实现简易点餐功能

    C#实现简易点餐功能

    这篇文章主要为大家详细介绍了C#实现简易点餐功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07

最新评论