JBuilder 开发人员指南 · 第 36 章:串行化 JavaBean

概述

本章来自《JBuilder 开发人员指南》,系统讲解 Java 对象串行化(Serialization)机制,重点是如何在 JavaBean 中利用串行化实现组件持久化(component persistence)。

核心概念

1. 串行化(Serialization)

  • 将对象转换为字节序列,可保存到磁盘文件或通过网络传输
  • 反向过程称为”解串行化”(deserialization)
  • 对于 JavaBean,串行化提供跨会话保存 bean 状态的简单方法

2. 文件命名约定

  • 串行化后的文件以 .ser 为扩展名
  • 文件名 = bean 类名 + .ser(如 MyBean.ser)

3. Serializable 接口

  • 标注接口(tagging/marking interface),无任何方法
  • 所有 GUI 组件默认实现此接口
  • 实现了该接口的类即可被 ObjectOutputStream.writeObject() 串行化

串行化机制详解

writeObject() 的递归行为

  • writeObject() 写出对象所有域的值(包括继承的)
  • 对象域中若包含其他对象,递归调用 writeObject()
  • 本原域(基本类型)直接写入流
  • 嵌套对象自动递归,直到所有对象都被写出

在 UI Designer 中串行化(最简单方式)

  1. 选择要串行化的组件
  2. 右击 → Serialize Component
  3. 指定组件名和保存目录(建议保留 .ser 扩展名)
  4. 确保类路径包含目标目录
  5. 点击 OK

用代码串行化

FileOutputStream fos = new FileOutputStream("file.ser");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(myObject);
oos.close();

解串行化

ObjectInputStream ois = new ObjectInputStream(new FileInputStream("file.ser"));
MyObject myObject = (MyObject) ois.readObject();
ois.close();

Beans.instantiate() 方法

为什么用 Beans.instantiate() 而不是 new?

  • Beans.instantiate() 自动装载串行化版本(.ser 文件)
  • 执行 applet 所需的附加内务处理
  • 修改基类后,下次 bean 读回内存时修改生效

配置 JBuilder 使用 Beans.instantiate()

项目级别:

  1. File → Project Properties
  2. Code Style 标签
  3. 勾选 “Use Beans.instantiate”

默认项目级别:

  1. Tools → Default Project Properties
  2. Code Style 标签
  3. 勾选 “Use Beans.instantiate”

异常处理

Beans.instantiate() 可能抛出异常,必须在 jbInit() 方法中与期望异常一起存在。

定制串行化

通过编写自己的例程控制串行化/解串行化过程,适用于:

  • 在自己编写的组件中控制串行化
  • 串行化不扩展 JBuilder 组件的类

Externalizable 接口

  • 提供对串行化/解串行化过程的完全控制
  • 需要手动实现 writeExternal() 和 readExternal() 方法

版本控制(Versioning)

  • 当类定义稍有变化时保持串行化兼容性
  • 通过 serialVersionUID 实现版本管理
  • 避免因类结构变更导致的反序列化失败

可行动点

  1. 在 JBuilder 中优先使用 Beans.instantiate() 而非 new 实例化可串行化 bean
  2. 配置 Code Style 使团队统一使用 Beans.instantiate()
  3. 对需要持久化的 JavaBean 确保实现 Serializable 接口
  4. 类结构变更时更新 serialVersionUID 以维护兼容性
  5. 使用 UI Designer 的可视化串行化功能快速保存组件状态

关联知识