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 中串行化(最简单方式)
- 选择要串行化的组件
- 右击 → Serialize Component
- 指定组件名和保存目录(建议保留
.ser扩展名) - 确保类路径包含目标目录
- 点击 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()
项目级别:
- File → Project Properties
- Code Style 标签
- 勾选 “Use Beans.instantiate”
默认项目级别:
- Tools → Default Project Properties
- Code Style 标签
- 勾选 “Use Beans.instantiate”
异常处理
Beans.instantiate() 可能抛出异常,必须在 jbInit() 方法中与期望异常一起存在。
定制串行化
通过编写自己的例程控制串行化/解串行化过程,适用于:
- 在自己编写的组件中控制串行化
- 串行化不扩展 JBuilder 组件的类
Externalizable 接口
- 提供对串行化/解串行化过程的完全控制
- 需要手动实现
writeExternal()和readExternal()方法
版本控制(Versioning)
- 当类定义稍有变化时保持串行化兼容性
- 通过
serialVersionUID实现版本管理 - 避免因类结构变更导致的反序列化失败
可行动点
- 在 JBuilder 中优先使用
Beans.instantiate()而非new实例化可串行化 bean - 配置 Code Style 使团队统一使用
Beans.instantiate() - 对需要持久化的 JavaBean 确保实现
Serializable接口 - 类结构变更时更新
serialVersionUID以维护兼容性 - 使用 UI Designer 的可视化串行化功能快速保存组件状态
关联知识
- JavaBean 规范 — JavaBean 组件模型基础
- JBuilder 开发工具 — JBuilder IDE 使用
- Java 对象串行化 — Java 标准串行化机制