“你好,阿米戈!我要对艾莉所讲的内容做一点补充。”

有时你需要对序列化过程进行控制。原因如下:

1) 对象尚未对序列化做好准备:其当前内部状态处于变化中。

2) 对象包含不可序列化的对象,但可以将其转换为易于序列化的形式,例如将其保存为字节数组或其他形式。

3) 对象要将其所有数据反序列化为一个单元并/或在序列化之前对其进行加密。

需要手动执行序列化的原因有很多。但是我们不想失去标准序列化提供的所有优势。毕竟,我们的对象可能会使用其他对象。但是,如果对象不支持序列化,则无法对其进行序列化。

针对这种情况也有相应的解决方法:Externalizable 接口。我们必须感谢富有远见的 Java 创建者。只需用 Externalizable 接口替换 Serializable 接口,我们的类即可手动管理序列化过程。

Externalizable 接口有两个方法(Serializable 接口则没有),序列化对象时 Java 机器会调用这两个方法。看起来如下所示:

代码
class Cat implements Externalizable
{
 public String name;
 public int age;
 public int weight;

 public void writeExternal(ObjectOutput out)
 {
  out.writeObject(name);
  out.writeInt(age);
  out.writeInt(weight);
}

 public void readExternal(ObjectInput in)
 {
  name = (String) in.readObject();
  age = in.readInt();
  weight = in.readInt();
 }
}

是不是想起点什么?

“天哪!这正是我们在考虑序列化之前尝试保存对象的方式。”

“这使一切变得简单:如果使用标准序列化就足够了,则我们只需继承 Serializable 接口。如果这还不够的话,我们将继承 Externalizable,并编写我们自己的代码来保存/加载对象。”

“但是标记为 Externalizable 的类是否被视为可序列化?我们可以使用这种类来‘安全地’存储对可序列化类的引用吗?”

“可以。如果一个类实现了 SerializableExternalizable,则被认为是可序列化的。”

“这是一个完美的解决方法。我很喜欢。”

“很高兴听到你这样说。但其实远非如此...你应该向汉斯教授询问所有细微差别。这些差别一定存在。他想给你一些阅读材料。”