Serializable 序列化[基于java]

前言:最近接触的技术慢慢增多,也写了一些方便的技术文档。苦于排版不够系统,干脆对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 常见问题

  1. 检查serialVersionUID是否一致
  2. 确认字段类型没有修改
  3. 删除旧的序列化文件重新生成

症状:反序列化后数据不对

• 检查是否有字段漏加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 • 安全方案 → 白名单校验 • 分布式方案 → 版本兼容策略

当前进度:🟢 基础掌握(可进行项目开发)

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注