前言:最近接触的技术慢慢增多,也写了一些方便的技术文档。苦于排版不够系统,干脆对Deepseek提了一些要求,让它重塑我写的这些文档。效果还不错,也拓展了一些还不够了解的知识。因此之后的技术分享很可能以这种形式出现,我自己读着还不错,请多提提意见!
这是我向Deepseek提问的模版:
- 第一:不说废话,直抒胸臆;
- 第二:能够给快速上手的人们快速开始的机会,比如多给命令行,支持复制粘贴;
- 第三:有深度,能够结合实战开发,最好多一些实例;
- 最后:如果能够引发人们思考更好。
0x00 基础知识(2分钟)
一句话理解:序列化就像把乐高玩具打包成盒子,反序列化就是拆开盒子恢复原样
- 序列化->具体(对象->数据) 序列化用于将抽象数据转化为网络传输/存储形式(JSON/XML/二进制)
- 反序列化->抽象(数据->对象) 反序列化主要是将数据抽象,便于业务逻辑处理
传播路径:[数据库] → 反序列化 → [程序处理(业务逻辑)] → 序列化 → [网络传输]
0x01 快速使用(5分钟)
import java.io.*;
// 第一步:实现Serializable接口(空接口)
class User implements Serializable { // [!code focus]
// 第二步:添加版本号
private static final long serialVersionUID = 1L; // [!code focus]
private String name;
private transient String password; // transient不参与序列化
}
// 第三步:序列化对象
try (ObjectOutputStream out = new ObjectOutputStream(
new FileOutputStream("user.data"))) { // [!code focus]
out.writeObject(new User("张三", "123456"));
}
// 第四步:反序列化
try (ObjectInputStream in = new ObjectInputStream(
new FileInputStream("user.data"))) {
User user = (User) in.readObject(); // [!code focus]
System.out.println(user.getName()); // 输出"张三"
System.out.println(user.getPassword()); // 输出null(因为transient)
}
0x02 核心记忆点
✔️ 建议做
• 给每个类添加serialVersionUID
(IDE可自动生成:Alt+Enter → Add serialVersionUID) • 敏感字段用transient
修饰
❌ 不要做
• 序列化大对象(超过1MB要考虑其他方案) • 修改已序列化类的字段类型(会报错!)
💡 场景联想
[数据库] → 反序列化 → [程序处理] → 序列化 → [网络传输]
0x03 常见问题
- 检查serialVersionUID是否一致
- 确认字段类型没有修改
- 删除旧的序列化文件重新生成
症状:反序列化后数据不对
• 检查是否有字段漏加transient • 验证序列化/反序列化代码顺序一致
0x04 新手实验室
实验1:修改serialVersionUID
- private static final long serialVersionUID = 1L;
+ private static final long serialVersionUID = 2L;
观察反序列化时的报错信息
实验2:移除transient
- private transient String password;
+ private String password;
查看反序列化后的密码值
0x05 未来升级入口(我将后续补充)
进阶预备区
• 高性能方案 → Protobuf • 安全方案 → 白名单校验 • 分布式方案 → 版本兼容策略
当前进度:🟢 基础掌握(可进行项目开发)