由于我们可以通过覆盖writeObject()和readObject()来覆盖默认的序列化过程,那么Externalizable接口的需求是什么?
我读到了
Externalizable 为我们提供了 writeExternal() 和 readExternal() 方法,这使我们可以灵活地控制 Java 序列化机制,而不是依赖于 Java 的默认序列化。
但是,如果我实现了 Serializable 并覆盖,readObject(), writeObject(), 那么它是否也意味着我正在自定义序列化过程?
它有什么不同?
谢谢。
public class ExternalizableClass implements Externalizable
{
public static ExternalizableClass CACHE = new ExternalizableClass(-1);
int id;
public ExternalizableClass()
{
id = (int)(Math.random() * 1000);
}
public ExternalizableClass(int i)
{
id = i;
}
@Override
public void writeExternal(ObjectOutput out) throws IOException
{
out.writeInt(id);
}
@Override
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException
{
//id = in.readInt();
id = in.readInt();
}
public Object writeReplace() throws ObjectStreamException
{
return new Write(0);
}
private class Write extends ExternalizableClass
{
int value;
public Write()
{
} …Run Code Online (Sandbox Code Playgroud) java serialization constructor deserialization externalizable
我在考虑外部化的目的,因为您可以简单地将属性标记为transient并防止其序列化。但是,经过进一步研究,我发现transient如果您需要决定在运行时需要什么,这种方法(即标记为)可能并不理想。从理论上讲,这对我来说是有意义的。但是,实际上我看不出外部化如何对运行时更友好。我的意思是,您仍然必须决定在类的定义中writeExternal()和readExternal()定义期间需要什么或不需要什么。那么,如何在运行时更友好?
强调这一点的文件如下,
如果一切都是通过实现 Serializable 接口自动处理的,为什么有人喜欢实现 Externalizable 接口并费心定义这两个方法?只需对过程进行完全控制。好的...让我们举一个例子来理解这一点。假设我们有一个具有数百个字段(非瞬态)的对象,并且我们只希望将几个字段存储在持久存储中而不是全部。一种解决方案是将所有其他字段(除了我们要序列化的字段)声明为瞬态,默认的序列化过程将自动处理。但是,如果这几个字段在设计时不是固定的,而是在运行时有条件地决定呢?在这种情况下,实现 Externalizable 接口可能是更好的解决方案。