“你好,阿米戈!我要对艾莉所讲的内容做一点补充。”
有时你需要对序列化过程进行控制。原因如下:
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 的类是否被视为可序列化?我们可以使用这种类来‘安全地’存储对可序列化类的引用吗?”
“可以。如果一个类实现了 Serializable 或 Externalizable,则被认为是可序列化的。”
“这是一个完美的解决方法。我很喜欢。”
“很高兴听到你这样说。但其实远非如此...你应该向汉斯教授询问所有细微差别。这些差别一定存在。他想给你一些阅读材料。”
GO TO FULL VERSION