C# 中的序列化和反序列化示例

⚡ 智能摘要

C# 中的序列化将对象转换为字节流,以便将其保存到文件或在应用程序之间传输;反序列化则重建对象。本文将通过示例讲解如何序列化和反序列化对象。

  • 🔄 它是什么: 序列化将 C# 对象写入文件,反序列化将其读取出来。
  • 🏷️ [可序列化]: 类必须具有 [Serializable] 特性才能被序列化。
  • 💾 二进制格式: BinaryFormatter 和 FileStream 会将对象以二进制形式写入。
  • 🧩 格式: C# 还支持 XML 和 JSON 序列化,以实现可读性更高的输出。
  • 🤖 人工智能帮助: GitHub Copilot 等 AI 工具可以立即生成序列化代码。

C# 序列化和反序列化

C# 中的序列化和反序列化

当需要将对象数据从一个应用程序发送到另一个应用程序时,就会用到序列化和反序列化的概念。序列化用于将应用程序数据导出到文件中。目标应用程序随后使用反序列化来导出数据。trac提取应用程序中的数据以供进一步使用。

序列化是将 C# 类对象写入或序列化到文件的概念。假设您有一个名为 Tutorial 的 C# 类。该类有 2 个属性:ID 和 Tutorials 名称。

序列化可用于将 Tutorial 类的数据属性直接写入文件。反序列化用于从文件中读取数据并再次构造 Tutorial 对象。

C# 中的序列化类型

C# 支持多种序列化格式,您可以根据数据的使用场景选择合适的格式。主要格式如下所示。

  • 二进制序列化 将对象转换为紧凑的二进制流。它速度很快,但代码不可读,并且与 .NET 平台绑定。
  • XML 序列化 使用 XmlSerializer 类将对象的公共属性写入可读的 XML 文件。
  • JSON序列化 使用 System.Text.Json 或 Newtonsoft.Json 生成轻量级 JSON,这是 Web API 最常用的格式。
  • SOAP序列化 将数据格式化为 SOAP 消息,以便用于旧版 Web 服务。

如何在 C# 中序列化对象

让我们看一个例子来了解如何实现这一点。

在我们的示例中,我们将在代码中执行以下高级步骤

  1. 创建一个名为 Tutorial 的类,它有 2 个属性,分别是 ID 和 Name
  2. 然后,我们将从类中创建一个对象,并为 ID 属性分配值“1”,为 name 属性分配值“.Net”。
  3. 然后我们将使用序列化将上述对象序列化为名为 Example.txt 的文件
  4. 最后,我们将使用反序列化从文件中反序列化对象并在控制台中显示其值。

在控制台应用程序的 program.cs 文件中输入以下代码。

步骤1) 添加课程。

第一步是添加用于序列化的类

在 C# 中序列化对象

Code 解释:-

  1. 需要序列化的类需要具有 [Serializable] 属性。这是 C# 中的一个关键字。然后,此关键字将附加到 Tutorial 类。如果您不提及此属性,则在尝试序列化该类时会收到错误。
  2. 接下来是要序列化的类的定义。这里我们定义一个名为“Tutorial”的类,并提供 2 个属性,一个是“ID”,另一个是“Name”。

步骤2) 创建对象。

在此步骤中,首先我们将创建 Tutorial 类的对象并将其序列化为名为 Example.txt 的文件

在 C# 中序列化对象

Code 解释:-

  1. 首先,我们创建 Tutorial 类的一个对象。然后我们给 ID 赋值“1”,给 name 属性赋值“.net”。
  2. 然后我们使用格式化程序类,该类用于序列化或将对象转换为二进制格式。序列化文件中的数据采用二进制格式。接下来,我们创建一个文件流对象。文件流对象用于打开文件 Example.txt 进行写入。关键字 FileMode.Create 和 FileMode.Write 用于特别提及应打开文件进行写入。
  3. 最后,我们使用 Serialize 方法将二进制数据传输到文件。然后我们关闭流,因为写入 操作 做完了。

步骤3) 使用反序列化。

最后,为了确保数据存在于文件中,我们使用反序列化从文件中反序列化对象。

在 C# 中序列化对象

using System;
using System.IO;
using System.Linq;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using System.Threading.Tasks;
namespace DemoApplication
{
  [Serializable]
  class Tutorial
  {
  public int ID;
  public String Name;
   static void Main(string[] args)
   {
    Tutorial obj = new Tutorial();
    obj.ID = 1;
    obj.Name = ".Net";

    IFormatter formatter = new BinaryFormatter();
    Stream stream = new FileStream(@"E:\ExampleNew.txt",FileMode.Create,FileAccess.Write);

    formatter.Serialize(stream, obj);
    stream.Close();

    stream = new FileStream(@"E:\ExampleNew.txt",FileMode.Open,FileAccess.Read);
    Tutorial objnew = (Tutorial)formatter.Deserialize(stream);

    Console.WriteLine(objnew.ID);
    Console.WriteLine(objnew.Name);

    Console.ReadKey();
  }
 }
}

Code 解释:-

  1. 我们创建对象“”以只读模式打开文件 Example.txt。
  2. 然后我们使用格式化程序类来反序列化存储在Example.txt文件中的对象。返回的对象被设置为对象objnew。
  3. 最后,我们使用“ID”和“name”属性将对象“objnew”的属性显示到控制台。

设置上述代码后,使用以下方法运行项目 Visual Studio中,你将获得以下输出。

输出:-

在 C# 中序列化对象

从上面的输出中您可以看到文件中的值已被正确反序列化并显示在控制台中。

C# 中的 JSON 序列化

JSON 是现代应用程序和 Web API 中最广泛使用的格式。内置的 System.Text.Json namespace 通过单个方法调用对对象进行序列化和反序列化,如下所示。

using System;
using System.Text.Json;
namespace DemoApplication
{
  class Tutorial
  {
    public int ID { get; set; }
    public string Name { get; set; }
  }
  class Program
  {
    static void Main(string[] args)
    {
      Tutorial obj = new Tutorial { ID = 1, Name = ".Net" };
      string json = JsonSerializer.Serialize(obj);
      Console.WriteLine(json);

      Tutorial objnew = (Tutorial)JsonSerializer.Deserialize(json, typeof(Tutorial));
      Console.WriteLine(objnew.Name);
      Console.ReadKey();
    }
  }
}

输出:

{"ID":1,"Name":".Net"}
.Net

常见问题

序列化将 C# 对象转换为字节流(二进制、XML 或 JSON),以便将其保存到文件或发送到其他应用程序。反序列化则根据这些数据重建对象。

[Serializable] 特性标记一个类,使其对象可以被序列化。如果没有该特性,尝试将对象写入文件时,二进制序列化会抛出异常。

C# 支持二进制序列化(紧凑型,仅限 .NET)、通过 XmlSerializer 进行 XML 序列化、通过 System.Text.Json 进行 JSON 序列化,以及对旧版 Web 服务进行 SOAP 序列化。

序列化将对象的数据写入文件或流,而反序列化则将数据读回并在内存中重建原始对象。

BinaryFormatter 现已过时,并且被认为不安全,因为它在反序列化期间可能会执行有害代码。 Microsoft 建议新应用程序使用 System.Text.Json 或 XmlSerializer。

GitHub Copilot 等 AI 助手可以自动完成 Serialize 和 Deserialize 调用,添加 [Serializable] 属性,并根据简短的注释生成 JSON 或 XML 序列化代码。

是的。人工智能工具可以生成模型类,在 JSON、XML 和二进制格式之间进行选择,并添加错误处理,从而确保您的序列化代码安全完整。

二进制序列化使用 System.Runtime.Serialization.Formatters.Binary,JSON 使用 System.Text.Json,XML 使用 System.Xml.Serialization。

总结一下这篇文章: