简单理解:序列化与反序列化

序列化(Serialization)和反序列化(Deserialization)是计算机科学中两个核心概念,尤其在网络通信、数据存储和分布式系统中扮演着至关重要的角色。让我详细解释这两个过程及其实际应用。

1、基本概念

1.1 序列化(Serialization)

序列化是将数据结构或对象状态转换为可以存储或传输的格式的过程。这个格式通常是:

  • 字节序列(二进制格式)
  • JSON 或 XML(文本格式)
  • Protocol Buffers 或 MessagePack(紧凑二进制格式)
graph LR A[内存中的对象] --> B[序列化] B --> C[字节流/文本]

关键特点

  • 平台无关:序列化后的数据可以在不同系统间传输
  • 持久化:可将对象状态保存到文件或数据库中
  • 网络传输:适合在网络上发送数据

1.2 反序列化(Deserialization)

反序列化是将序列化后的数据恢复为原始数据结构或对象的过程

graph LR C[字节流/文本] --> D[反序列化] D --> A[内存中的对象]

关键特点

  • 重建对象:从序列化数据中恢复原始对象状态
  • 类型安全:确保重建的对象与原始对象类型一致
  • 完整性:保持对象关系和引用结构

2、为什么需要序列化和反序列化?

2.1 网络通信

当客户端和服务器通信时:

  • 客户端将请求对象序列化为字节流
  • 通过网络发送字节流
  • 服务器反序列化字节流为对象
  • 服务器处理请求并序列化响应
  • 客户端反序列化响应

2.2 数据持久化

将内存中的对象保存到文件或数据库

2.3 进程间通信

在不同进程或服务间传递复杂数据结构

3、序列化格式对比

格式 类型 特点 适用场景
JSON 文本 人类可读,广泛支持 Web API,配置文件
XML 文本 复杂结构,支持Schema 企业级系统,SOAP服务
Protocol Buffers 二进制 高效,类型安全,向前/向后兼容 微服务通信,高性能系统
MessagePack 二进制 比JSON更紧凑,支持扩展类型 移动应用,IoT设备
BSON 二进制 JSON的二进制扩展,支持二进制数据 MongoDB数据库存储
Java Serialization 二进制 平台特定,包含完整类型信息 JVM应用内部通信

4、JavaScript中的序列化与反序列化

4.1 json 方法

vbscript 复制代码
const obj = {
    name: "John",
    age: 30,
    hobbies: ["reading", "hiking"],
    metadata: {
        createdAt: new Date(),
        isAdmin: true
    }
};

// 序列化
const jsonString = JSON.stringify(obj);
console.log(jsonString);
// 输出: {"name":"John","age":30,"hobbies":["reading","hiking"],"metadata":{"createdAt":"2023-05-15T08:30:00.000Z","isAdmin":true}}

// 反序列化
const parsedObj = JSON.parse(jsonString);
console.log(parsedObj.metadata.createdAt); 
// 输出: "2023-05-15T08:30:00.000Z" (字符串,不是Date对象)

注意事项: 不是深克隆,导致一些数据丢失(循环引用、Map、Set、Date、继承、等)

4.2 SuperJSON(推荐)

javascript 复制代码
import superjson from 'superjson';

const user = {
    name: "Alice",
    createdAt: new Date(),
    permissions: new Set(["read", "write"]),
    metadata: new Map([["id", 123]])
};

// 序列化
const serialized = superjson.stringify(user);

// 反序列化
const deserialized = superjson.parse(serialized);

console.log(deserialized.createdAt instanceof Date); // true
console.log(deserialized.permissions instanceof Set); // true
console.log(deserialized.metadata instanceof Map); // true
相关推荐
+VX:Fegn08958 小时前
计算机毕业设计|基于springboot + vue蛋糕店管理系统(源码+数据库+文档)
前端·数据库·vue.js·spring boot·课程设计
Nicander9 小时前
我给 Excalidraw 做了一个本地工作区:DrawSpace
前端·开源
linux_cfan11 小时前
17 · 引擎适配器全景:HLS/DASH/Vimeo/Mux/Cast
前端·javascript·音视频
计算机魔术师12 小时前
烧掉2780亿美元还不够?OpenAI的资本豪赌让人头皮发麻
前端
IT_陈寒12 小时前
Java线程池用错参数,我的服务居然悄悄崩溃了
前端·人工智能·后端
卡布鲁13 小时前
React useMemo 与 useCallback 完全指南:原理、场景与避坑
前端·react.js
碳基修炼13 小时前
排查记:本地 devServer 是 http,浏览器却把 302 重定向升级成了 https
前端·http
步行cgn13 小时前
Spring p 命名空间注入详解
java·前端·spring
何何____13 小时前
Vue 生命周期详解
前端·javascript
江米小枣tonylua13 小时前
TypeScript 全面の拥抱 !Prisma 8 + Electron 升级实战
前端