JDK1.1 的 新 功 能-- 序 列 化 接 口(Serializable interface), 简 化 了 对 象 持 久 化(Persistence) 的 实 现。 以 下 介 绍 如 何 通 过SMTP E-mail 将 对 象 传 送 给 另 一 个 用 户。
--------------------------------------------------------------------------------
摘 要: 一 些 应 用 程 序 需 要 以 一 种 非 实 时 的 方 式( 例 如 旅 行 指 南、 错 误 报 告(bug report)、 时 间 表(time sheet) 等) 和 其 余 用 户 共 享 对 象。 Java 语 言 开 发 工 具 包(JDK)1.1 版 提 供 了 一 个 重 要 的 功 能: java.io.Serializable 接 口。 该 技 术 能 让 你 知 道 如 何 序 列 化 一 个 对 象, 然 后 用e-mail 传 给 其 它 用 户。
对 象 持 久 化 和 用 户 间 对 象 共 享 是 许 多 商 业 解 决 方 案 的 基 础。 例 如,一个公 司 可 以 用 从 本 公 司 网 址 启 动 的Applet 来 完 成 一 个 时 间 表 的 制 作。 同 样 该公 司 也 可 以 提 供 象 具 有 开 支 报 告、 旅 行 指 南、 错 误 报 告(bug report) 等 功 能 的Applet。 在 这 些 情 况 下, 从Applet 的 使 用 者 获 得 的 数 据 需 要 和 负 责 薪 水、 付 款、旅 行 房 间 预 订 的 人 们 共 享。 执 行 这 些 职 能 的 人 们 可 能 分 布 在 不 同 的 城 市和 国 家, 可 能 工 作 在 不 同 的 时 区, 不 能 希 望 每 个 工 作 人 员 都 能 象 猫 头 鹰 一 样在 晚 上 工 作 以 填 写 这 样 的 表 格。 相 同 的 信 息 也 不 应 该 重 新 输 入。 因 此, 能 够存 储 并 且 把 这 些 相 关 对 象 传 送 到 商 业 应 用 中 是 这 些applet 有 别 于 其 它applet 的 优 势。
目 前 已 经 有 许 多 方 法 能 实 现 对 象 的 持 久 化, 例 如 使 用 对 象 数 据 库 和 磁盘 文 件。 同 样 的 也 有 许 多 办 法 可 以 共 享 对 象, 例 如 将 数 据 写 入 一 个 套 接 字, 或 者 实 现 一 个 符 合CORBA, SOM 的 模 型。 以 上 这 几 种 方 案 均 有 自 己 的 优 点, 当 你 设 计 你 的 商 业 解 决 方 案 时, 需 要 认 真 地 考 虑 这 些 方 案。 但 是, 还 有 一 种 开 销 不 大 但 可 靠 的 方 法, 它 使 用Internet 和Intranet 用 户 能 够 获 取 的 技 术 服 务 在 世 界 范 围 传 送 对 象 的 拷 贝。 它 就 是 简 单 邮 件 传 输 协 议, SMTP。
用E-mail 发 送Java 对 象
存 储 和 保 存 对 象 的 一 个 简 单 方 法 是 将 对 象 序 列 化 而 后 用E-mail 将 它 发 送 给 别 的 用 户。 这 种 方 法 有 以 下 优 点:
发 送 的 计 算 机 或NC( 网 络 计 算 机) 无 需 硬 盘 空 间
使 用 现 有 的 系 统 传 送、 排 队、 发 送 对 象
允 许 用 户 使 用 最 喜 欢 的 邮 件 客 户 程 序 来 接 受 邮 件
提 供 简 单 的 机 制 将 同 一 对 象 的 拷 贝 分 发 给 许 多 人
这 种 方 法 也 有 不 足 之 处:
邮 件 的 传 送 可 能 因 为E-mail 主 机 的 关 机 而 被 较 长 时 间 地 延 迟。 所 有 的 主 机 都 可 能 出 现 这 种 情 况, E-mail 服 务 器 的 错 误 恢 复 优 先 级 通 常 比 数 据 库 服 务 器 低。
邮 件 的 传 送 不 能 得 到 保 证-- 在 你 的E-mail 服 务 器 通 知 你 邮 件 没 有 发 出 时, 你 不 得 不 重 新 发 送 邮 件。
E-mail 服 务 器 和POP 客 户 程 序 的 功 能 不 足 以 处 理 大 量 交 易 信 息。
这 些 不 足 和 你 使 用 的 应 用 程 序 有 关。 对 于 很 多 商 业 解 决 方 案, 这 些 不 足 并 不 重 要。 作 为 一 个 设 计 人 员, 你 工 作 的 一 部 分 就 是 在 全 面 考 虑 价 格、 性 能 和 需 求 的 情 况 下 确 定 系 统 的 最 佳 整 体 结 构。
使 用Java 传 送 对 象 的 四 个 步 骤:
Applet 必 须 依 次 以 下 面 所 列 出 的 四 个 步 骤 传 送Java 对 象:
序 列 化 有 关 对 象
发 送 时 选 择Base64 编 码 方 式 对 序 列 化 对 象 编 码(RFC 1521)
与 一 个SMTP 服 务 器 连 接
将 该 对 象 传 送 到 这 个SMTP 服 务 器
下 面 将 介 绍 如 何 用E-mail 发 送 一 个 假 设 的" 臭 虫" 报 告 到 公 司 的 质 量 保 证 部 门。
将 对 象 序 列 化
JDK1.1 提 供 的 一 个 奇 妙 的 机 制, java.io.Serializable 接 口, 能 够 序 列 化 并 且 重 建 对 象。 这 个 接 口 能 使 用 存 储 对 象(writeObject()) 和 恢 复 对 象(readObject()) 方 法 函 数。 在 很 多 情 况 下, 使 用 这 个 接 口 很 方 便, 只 需 实 现 并 且 调 用 这 两 个 方 法 函 数。
以 下 的 代 码 定 义 了 一 个 简 单 的BugReport 对 象, 它 实 现 了 最 简 单 的 序 列化接 口。
1 import java.Io.*;
2 public class BugReport implements Serializable {
3 private Float m_SoftwareVersion; // version number from Help.About, e.g. "1.0"
4 private String m_ErrorDescription; // Description of error
5 private int m_Severity; // 1=System unusable - 5=Minor Aesthetic defect
6 public BugReport (Float SoftwareVersion, String ErrorDescription, int Severity) {
7 m_SoftwareVersion = SoftwareVersion;
8 m_ErrorDesctiption = ErrorDescription;
9 m_Severity = Severity;
10 }
11 public BugReport () {} // for reconstituting serialized objects
12 public void save (OutputStream os)
13 throws IOException {
14 try {
15 ObjectOutputStream o = new ObjectOutputStream(os);
16 o.writeObject(this);
17 o.flush();
18 }
19 catch (IOException e) {throw e;}
20 }
21 public BugReport restore (InputStream is)
22 throws IOException, ClassNotFoundException {
23 BugReport RestoredBugReport = null;
24 try {
25 ObjectInputStream o = new ObjectInputStream(is);
26 RestoredBugReport = (BugReport)o.readObject();
27 }
28 catch (IOException e) {throw e;}
29 catch (ClassNotFoundException e) {throw e;}
30 return RestoredBugReport;
31 }
32 }
1 使 用import 语 句 引 入I/O 包, 包 括 序 列 化 接 口。