c#序列化详解示例

C#序列化详解示例

本文将详细介绍C#中的序列化操作,并提供了两个示例,帮助读者更加深入地理解序列化的概念和操作方法。

什么是序列化

序列化是将一个对象转换成字节流的过程,通常用于在网络上或本地存储中传输或保存数据。在C#中,使用类库中的System.Runtime.Serialization命名空间中的类来实现序列化与反序列化操作。

如何序列化一个对象

步骤1:创建需要序列化的类

首先需要创建一个需要进行序列化的类,例如以下示例:

[Serializable]
class Person
{
   public string Name;
   public int Age;
}

可以看到这个Person类声明了[Serializable]特性,这表示该类可以进行序列化操作。

步骤2:创建序列化对象

使用BinaryFormatter类来创建序列化对象,代码如下:

using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

BinaryFormatter formatter = new BinaryFormatter();

步骤3:序列化对象

使用Serialize方法将对象序列化成字节流,代码如下:

Person p = new Person() { Name = "张三", Age = 20 };
using (FileStream fs = new FileStream("person.dat", FileMode.Create))
{
    formatter.Serialize(fs, p);
}

这个例子中将Person对象序列化成person.dat文件。

如何反序列化一个对象

步骤1:创建需要反序列化的类

首先需要创建一个需要进行反序列化的类,例如以下示例:

[Serializable]
class Person
{
    public string Name;
    public int Age;
}

可以看到这个Person类同样声明了[Serializable]特性,这表示该类可以进行序列化操作。

步骤2:创建反序列化对象

使用BinaryFormatter类来创建反序列化对象,代码如下:

using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

BinaryFormatter formatter = new BinaryFormatter();

步骤3:反序列化对象

使用Deserialize方法将字节流反序列化成对象,代码如下:

using (FileStream fs = new FileStream("person.dat", FileMode.Open))
{
    Person p = (Person)formatter.Deserialize(fs);
    Console.WriteLine($"Name:{p.Name} Age:{p.Age}");
}

这个例子中将person.dat文件反序列化成Person对象,并输出NameAge属性。

示例1:将对象序列化到内存中

下面示例将Person对象序列化成字节数组,然后反序列化回对象:

Person p = new Person() { Name = "李四", Age = 25 };
MemoryStream ms = new MemoryStream();
formatter.Serialize(ms, p);
ms.Position = 0;
Person p2 = (Person)formatter.Deserialize(ms);
Console.WriteLine($"Name:{p2.Name} Age:{p2.Age}");

这个例子中,使用MemoryStream类来将序列化后的Person对象保存到内存中,并通过Position属性将MemoryStream重置到起始位置,然后反序列化得到Person对象。

示例2:序列化与远程调用

下面示例将Person对象序列化成字节数组,并通过远程调用传递该字节数组:

Person p = new Person() { Name = "王五", Age = 30 };
using (MemoryStream ms = new MemoryStream())
{
    formatter.Serialize(ms, p);
    ms.Position = 0;
    byte[] buffer = ms.ToArray();
    // 远程调用
    RemoteCall(buffer);
}

这个例子中,通过将序列化后的Person对象保存到字节数组中,可以方便地通过远程调用传递该对象。RemoteCall方法是用于模拟远程调用的一个示例,其代码如下:

void RemoteCall(byte[] buffer){
    using (MemoryStream ms = new MemoryStream(buffer))
    {
        Person p = (Person)formatter.Deserialize(ms);
        Console.WriteLine($"Name:{p.Name} Age:{p.Age}");
    }
}

通过反序列化传递过来的字节数组,可以得到原始的Person对象。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c#序列化详解示例 - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • asp.net(C#)使用QRCode生成图片中心加Logo或图像的二维码实例

    这里是”asp.net(C#)使用QRCode生成图片中心加Logo或图像的二维码实例”的完整攻略。 1. 背景和需求 在很多场景中,我们需要使用二维码来进行信息传递和交流。而一般的二维码相对来说显得过于平淡无奇,很多时候却又不能脱离二维码的原本用途。那么这时,我们就可以使用带有Logo或图像的二维码来达到更好的显示效果,增加视觉冲击力,吸引更多的用户获取信…

    C# 2023年6月1日
    00
  • 常用C#关键字详解教程(比较全面)

    常用C#关键字详解教程 C#是一种现代的、对象导向的编程语言,用于.NET平台。在C#中有许多关键字,这些关键字用于定义变量、控制流程、类或结构、枚举等。下面我们将详细讲解C#中常用的关键字。 变量定义相关关键字 var var用于在编译期间推断变量类型。它指示编译器基于初始化表达式计算左侧变量的类型。例如: var str = "hello wo…

    C# 2023年5月15日
    00
  • C#操作注册表之RegistryKey类

    C#是一种强类型、面向对象的编程语言,它在Windows操作系统中可以通过RegistryKey类来操作注册表。RegistryKey类提供了许多与Windows注册表相关的方法和属性。本文将对RegistryKey类进行详细讲解。 什么是注册表? Windows操作系统中的注册表是一种用于存储配置信息的数据库。它存储了Windows操作系统和应用程序的配置…

    C# 2023年6月7日
    00
  • asp.net GridView排序简单实现

    下面我将为你详细讲解“asp.net GridView排序简单实现”的完整攻略。 一、前置知识 在讲解排序实现前,我们需要先了解GridView控件的使用方法: 1. GridView的基本用法 GridView是asp.net中的一个非常常用的控件,一般用于展示数据表格。使用GridView控件展示数据非常方便。GridView控件有如下几个主要的属性: …

    C# 2023年5月31日
    00
  • C# 弹出窗口show()和showdialog()的两种方式

    C# 中,显示窗口有两种方式:Show() 和 ShowDialog()。两种方法使用的时候略有不同,本文将详细讲解这两种方法的用法。 Show() Show() 方法用于显示窗口,窗口不会阻止调用线程的执行。当调用 Show() 方法时,窗口将被显示出来,但是代码在 Show() 方法返回之后仍然会继续执行。以下是使用 Show() 方法的示例: // 创…

    C# 2023年6月7日
    00
  • 在多线程中调用winform窗体控件的实现方法

    在多线程中调用winform窗体控件是开发过程中常见的问题,因为在多线程场景下,是不允许直接操作UI控件的。下面是实现方法的完整攻略。 1. 合适的线程池 要在多线程中操作UI控件,第一步就要选用合适的线程池,它允许我们在不同的线程下执行不同的后台操作,同时又可以保留主线程的UI。以下是一个简单的示例: //线程池容量为5 ThreadPool.SetMax…

    C# 2023年5月15日
    00
  • C#实现对二维数组排序的方法

    下面是 C# 实现对二维数组排序的方法的攻略: 1. 实现方法 C# 中可以使用 Array 类的 Sort() 方法来实现二维数组的排序。Sort() 方法可以根据数组中的元素进行排序,所以在对二维数组排序时,需要先确定排序的方式(按行、按列、按某个元素的值等等)。下面以按行进行排序为例: 首先可以使用二重循环遍历数组,将每一行转换成一个一维数组。接着使用…

    C# 2023年6月7日
    00
  • C#通过PInvoke调用c++函数的备忘录的实例详解

    C#通过PInvoke调用C++函数的备忘录 什么是PInvoke PInvoke是Platform Invoke的缩写,是.NET Framework提供给C#程序员调用非托管DLL(Dynamic Link Library)在 Windows 平台上的接口技术。PInvoke 提供的主要技术便是 Marshal 类,Marshal 类可以完成 数据类型 …

    C# 2023年6月7日
    00
合作推广
合作推广
分享本页
返回顶部