亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> java

Java 对象序列化:持久化、反序列化与版本演进

对象序列化将对象转为字节流(含类元数据、字段值),可持久化到文件/数据库/网络传输;反序列化重建对象。跨 JVM、跨平台兼容。

核心接口与流

序列化条件

  1. 类实现 Serializable
  2. 所有非 transient 字段均可序列化(基本类型、String、实现 Serializable 的对象)

Employee 示例


public class Employee implements Serializable {
    private static final long serialVersionUID = 1L; // 显式声明版本ID
    
    public String name;
    public String address;
    public transient int SSN; // transient:不序列化
    public int number;
    
    public void mailCheck() { System.out.println("邮寄给 " + name); }
}

序列化与反序列化实战

序列化


Employee e = new Employee();
e.name = "Reyan Ali"; e.address = "Phokka Kuan"; e.SSN = 11122333; e.number = 101;

try (FileOutputStream fos = new FileOutputStream("employee.ser");
     ObjectOutputStream oos = new ObjectOutputStream(fos)) {
    oos.writeObject(e);
    System.out.println("序列化完成");
}

反序列化


Employee e = null;
try (FileInputStream fis = new FileInputStream("employee.ser");
     ObjectInputStream ois = new ObjectInputStream(fis)) {
    e = (Employee) ois.readObject(); // 需强转
} catch (ClassNotFoundException ex) {
    System.err.println("类未找到,版本不匹配?");
}
System.out.println("姓名: " + e.name); // Reyan Ali
System.out.println("SSN: " + e.SSN);   // 0 (transient 字段丢失,默认值)

关键细节

版本演进兼容性

变更兼容性处理
增加字段✅ 兼容新字段取默认值
删除字段✅ 兼容忽略流中数据
字段类型变更❌ 不兼容抛 InvalidClassException
修改 serialVersionUID❌ 不兼容强制不兼容
实现/移除 Serializable❌ 不兼容流结构根本改变

自定义序列化逻辑

实现两个私有方法(特定签名),完全控制过程:


private void writeObject(ObjectOutputStream out) throws IOException {
    out.defaultWriteObject(); // 默认序列化非 transient 字段
    out.writeInt(computedHash); // 额外写入派生值
}

private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
    in.defaultReadObject(); // 默认读取
    this.computedHash = computeHash(); // 重新计算
}

替代方案

安全警示

反序列化不可信数据可导致远程代码执行 (RCE)(Gadget Chain)。防御:

  1. 避免反序列化不可信源数据
  2. 使用 ObjectInputFilter (Java 9+) 白名单类
  3. 改用 JSON/Protobuf 等安全格式
  4. 设置 -Djdk.serialFilter=... 全局过滤

java

  1. 深入理解 Java final 关键字:变量、方法与类的不可变性
  2. Java instanceof 运算符完全指南:用法、继承与接口检查
  3. 精通 Java 继承:核心概念、类型与实战示例
  4. 深入理解 Java 静态嵌套类:用法、差异与实战示例
  5. 精通 Java 匿名内部类:定义、语法与实战示例
  6. Java 单例模式详解:安全实现与使用指南
  7. 精通 Java 反射:运行时检查类、方法与字段
  8. 精通 Java ArrayList:操作、方法与最佳实践
  9. 掌握 Java ObjectOutputStream:序列化、核心方法与实战示例
  10. 掌握 Java 泛型:构建可复用、类型安全的代码
  11. 掌握 Java 文件操作:java.io 包下的创建、读取、写入与删除
  12. 精通 Java:理解对象、类与核心 OOP 概念