news 2026/4/16 12:50:52

序列化和反序列化

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
序列化和反序列化

一、核心概念(用生活例子理解)

想象一下:

  • 你有一个乐高拼好的小汽车(对应程序中的Java 对象,比如ChatMessage)。
  • 序列化:把这个乐高小汽车拆成一个个独立的零件,并用清单记录每个零件的位置、形状(→ 把 Java 对象转换成字节流 / JSON 字符串等可存储 / 传输的格式)。
  • 反序列化:根据清单,把零散的乐高零件重新拼成原来的小汽车(→ 把字节流 / JSON 字符串还原成原来的 Java 对象)。
官方定义

表格

操作核心含义
序列化 (Serialize)内存中的对象(如ChatMessage实例)转换为字节序列 / 字符串(如 JSON),方便存储到文件 / 数据库、或网络传输。
反序列化 (Deserialize)存储 / 传输的字节序列 / 字符串(如数据库里的 JSON)还原为内存中的对象,让程序可以直接使用。

二、为什么需要序列化 / 反序列化?

以你之前的代码场景为例:

  1. 存储需求ChatMessage对象是内存中的临时数据,程序重启就会消失。把它序列化成 JSON 字符串存到 MongoDB,就能持久化保存。
  2. 传输需求:如果你的聊天程序是分布式的(比如前端→后端→数据库),对象无法直接在网络中传输,需要序列化成 JSON / 二进制流,传输后再反序列化。
  3. 跨语言交互:JSON 是通用格式,Java 序列化的 JSON 字符串,前端 JavaScript 可以反序列化使用,实现跨语言数据交互。

三、代码示例(直观理解)

以你熟悉的ChatMessage为例,用 Jackson 库演示序列化 / 反序列化:

1. 准备实体类

java

运行

import com.fasterxml.jackson.databind.ObjectMapper; import lombok.Data; @Data // 简化getter/setter,需要lombok依赖 public class ChatMessage { private String memoryId; private String content; private Long timestamp; }
2. 序列化(对象 → JSON 字符串)

java

运行

public class SerializeDemo { public static void main(String[] args) throws Exception { // 1. 创建内存中的对象 ChatMessage message = new ChatMessage(); message.setMemoryId("mem_123"); message.setContent("你好,MongoDB!"); message.setTimestamp(System.currentTimeMillis()); // 2. 序列化:对象 → JSON字符串(相当于拆乐高) ObjectMapper objectMapper = new ObjectMapper(); String jsonStr = objectMapper.writeValueAsString(message); System.out.println("序列化后的JSON:"); System.out.println(jsonStr); // 输出:{"memoryId":"mem_123","content":"你好,MongoDB!","timestamp":1740000000000} } }
3. 反序列化(JSON 字符串 → 对象)

java

运行

public class DeserializeDemo { public static void main(String[] args) throws Exception { // 1. 从数据库/文件中读取的JSON字符串 String jsonStr = "{\"memoryId\":\"mem_123\",\"content\":\"你好,MongoDB!\",\"timestamp\":1740000000000}"; // 2. 反序列化:JSON字符串 → 对象(相当于拼乐高) ObjectMapper objectMapper = new ObjectMapper(); ChatMessage message = objectMapper.readValue(jsonStr, ChatMessage.class); System.out.println("反序列化后的对象:"); System.out.println("memoryId: " + message.getMemoryId()); // 输出:mem_123 System.out.println("content: " + message.getContent()); // 输出:你好,MongoDB! } }

四、常见的序列化格式

  1. JSON:最常用,可读性高、跨语言,你的代码中就是用这种格式(chatMessages.getContent()是 JSON 字符串)。
  2. XML:老牌格式,可读性高但体积大,现在用得少。
  3. 二进制序列化(Java 原生):把对象转成字节流,体积小但只能 Java 之间使用,不跨语言。
  4. Protobuf:谷歌出品,二进制格式,体积小、效率高,适合高性能传输场景。

总结

  1. 序列化:对象 → 字符串 / 字节流(便于存储 / 传输),核心是 “拆”。
  2. 反序列化:字符串 / 字节流 → 对象(便于程序使用),核心是 “拼”。
  3. 你代码中的messagesFromJson()就是典型的反序列化操作,把 MongoDB 中存储的 JSON 字符串还原成ChatMessage对象。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/15 15:31:19

第21届智能车竞赛-智能视觉组规则修改优化

简 介: 本文介绍了第21届智能车竞赛人工智能视觉组比赛规则的三项重要修改:1)统一车模标识牌安装方式,采用磁吸设计并固定高度为15cm;2)将标识牌颜色由黄色改为灰绿色(RGB:90,179,89&#xff09…

作者头像 李华
网站建设 2026/4/16 9:37:12

鼻窦ct检查做什么,多少钱?这个和鼻内镜什么区别

鼻窦CT检查是通过X线断层扫描,清晰呈现鼻腔、鼻窦的骨性结构与软组织形态,核心用于排查鼻窦相关病变。 检查主要作用 1. 明确病变类型 ◦ 诊断鼻窦炎、鼻息肉、鼻中隔偏曲的严重程度,判断鼻窦内是否有积液、炎症或新生物; ◦ 排查鼻窦骨折、先天性发育异常,以及肿瘤等占…

作者头像 李华
网站建设 2026/4/15 16:23:02

两个美国:精英的知识崇拜与底层的反智驯化

笔者在读历史学家理查德霍夫施塔特(Richard Hofstadter)在1963年出版的经典著作《美国生活中的反智主义》(Anti-Intellectualism in American Life)。这是读书笔记的第二篇 在美国,知识从未真正被抛弃——它只是被重新…

作者头像 李华
网站建设 2026/4/10 13:25:31

Vue生命周期和工程化开发

vue生命周期:一个Vue实例从创建到销毁的整个过程生命周期的四个阶段:1创建,2挂载,3更新,4 销毁创建阶段:new Vue 创建响应式数据挂载阶段:渲染模版更新阶段:修改数据,更新视图创建和…

作者头像 李华
网站建设 2026/3/17 16:55:55

人工设计问卷vs虎贲等考AI:3天vs30分钟,学术级问卷原来可以这么做

“查了20份文献,量表还是设计不规范”“逻辑漏洞被导师批‘无效问卷源头’”“回收300份问卷,却因题项歧义导致数据作废”——做学术调研时,问卷设计往往成为“隐形拦路虎”。传统人工设计问卷,不仅要精通量表设计原理、掌握逻辑校…

作者头像 李华
网站建设 2026/4/16 7:21:45

【毕设】java-springboot+vue“漫画之家”系统毕业设计

💟博主:程序员俊星:CSDN作者、博客专家、全栈领域优质创作者 💟专注于计算机毕业设计,大数据、深度学习、Java、小程序、python、安卓等技术领域 📲文章末尾获取源码数据库 🌈还有大家在毕设选题…

作者头像 李华