序列化和反序列化

概念

序列化,是指将对象(或数据结构)转换成一种可传输、可保存的格式的过程。这种格式通常是与平台无关的【**跨平台】**字节流(如Json、二进制、XML等)。

反序列化,即是将被序列化的文件还原成原对象(或数据结构)的过程。

优势

相较于一般直接将对象存在磁盘相比,主要有以下几点优势:

安全性

若将对象直接保存到磁盘,其他人在查看磁盘中的文件时能轻易知道保存的内容,甚至可以直接篡改数据,有很大的风险。

而通过序列化将对象保存到磁盘,可以进行简单的加密(Json、二进制或XML加密),使其他人不了解保存的数据信息,而且在篡改数据后,反序列化很可能会直接失败使程序员能迅速察觉到风险。

跨平台

将对象转换为平台无关的格式(如 JSON、XML、Protobuf、二进制流等),支持不同操作系统、编程语言之间的数据交换。

而直接写入内存二进制数据,依赖特定平台的内存布局(如字节序、对齐方式),无法跨语言或跨平台使用。

封装性

直接存储中,若要存储多个对象,就要创建多个文件,读取时提取相应文件即可。

而使用序列化,会将多个对象数据整合起来,转换成流存放在磁盘中,读取时只需反序列化该文件即可,实现了封装性。

使用场景

1、数据持久化

将内存中的对象保存到磁盘或数据库,以便程序重启后恢复状态。
示例:

  • 游戏存档:保存玩家等级、装备等复杂数据。

  • 应用配置:存储用户设置的偏好(如主题、语言)。

  • 缓存数据:临时保存计算结果,避免重复计算。

2、网络通信(进程线程间)

在不同服务、设备或语言之间传输结构化数据。
示例:

  • API接口:客户端与服务端通过JSON/XML交换数据。

  • 微服务调用:gRPC使用Protobuf序列化数据。

  • 消息队列:Kafka、RabbitMQ传输序列化的消息。

具体实例

使用C#保存对象,将对象序列化为二进制进行存储。

复制代码
// 1、首先引入二进制序列化库
using System.Runtime.Serialization.Formatters.Binary;

// 2、在类上面加可序列化标志,即[Serializable]
[Serializable]
class Student
{
    public string Name;
    public int Age;
    public char Sex;
    public String Birthday;
}

// 3、序列化
        //[1]创建文件流
        FileStream fs = new FileStream("obj.stu", FileMode.Create);
        //[2]创建二进制序列化器
        BinaryFormatter bf = new BinaryFormatter();
        //[3]调用序列化方法
        bf.Serialize(fs, stu);
        //[4]关闭文件流
        fs.Close();

        //[1]创建文件流
        FileStream fs2 = new FileStream("obj.stu", FileMode.Open);
        //[2]创建二进制序列化器
        BinaryFormatter bf2 = new BinaryFormatter();
        //[3]调用反序列化方法
        Student[] stu3 = (Student[])bf2.Deserialize(fs2);
        //[4]关闭文件流
        fs.Close();
相关推荐
samble6 小时前
从零搭建灌装监控系统(十七):LiveCharts 实时温度曲线
c#·wpf·mvvm·modbus·工业控制
淡海水15 小时前
02-07-原理篇-GC暂停时间的本质
开发语言·unity·c#·gc·暂停时间
小羊没烦恼!17 小时前
OS X 上使用.NET开发应用程序
开发语言·前端·数据库·人工智能·c#·策略模式
Behavior18 小时前
Unity 7.0 Alpha 拆解:编辑器干掉 Mono 换 CoreCLR
c#·unity3d·游戏开发
淡海水19 小时前
02-06-原理篇-增量式GC与并发GC
算法·unity·c#·并发·gc·增量
Vertira19 小时前
C# 函数封装成 DLL,
开发语言·c#
浅尝辄止;20 小时前
设计模式在HIS/LIS医疗系统中的完整实践指南(C#版)
开发语言·设计模式·c#
kimloner1 天前
开源一个 376KB 的 Windows 桌面小工具:便签 + 截图标注 + OCR + 待办提醒(C# / WinForms)
windows·开源·c#·ocr·winforms
阿松爱学习1 天前
【Unity开发】Aspose.PDF的使用
unity·pdf·c#
半亩码田1 天前
C#转Python第4.8篇:正则表达式:Python re 模块 vs C# System.Text.RegularExpressions
python·正则表达式·c#