1

我已阅读以下文章:

http://javapapers.com/core-java/externalizable-vs-serializable/

在对象反序列化(重构)中,公共无参数构造函数用于重构对象。在 Serializable 的情况下,不使用构造函数,而是使用从 ObjectInputStream 读取的数据重新构造对象。
上述要点随后要求 Externalizable 对象必须具有公共的无参数构造函数。在 Seriablizable 的情况下,它不是强制性的。

关于构造函数调用是真的吗

可序列化:
反序列化仅调用最近的非Serializable祖先的构造函数

可外化:
反序列化只调用实现Externalizable接口的类的构造函数。

?

4

2 回答 2

1

是的,在字节码中,您可以创建对象的实例并调用层次结构中的任何构造函数。事实上,构造函数是一种特殊的方法,它甚至可以多次调用它。

许多反序列化器只使用 Unsafe.allocateInstance() 并且不调用任何构造函数。这样做是为了最大限度地减少反序列化时的副作用。

于 2014-12-23T08:28:36.450 回答
1

Externalizable 接口的反序列化过程取决于传递的构造函数,我们显式创建它的对象,但在 Serializable 接口的情况下,对象由 ObjectStreamClass.newInstance() 创建。所以这里没有构造函数的作用。

之后,它在内部存储与传递的 inputStream 对象链接的数据/对象数组(任何自定义字段、字符串、int ...等)。所有数组元素(存储对象的状态)稍后设置到对象中,并将返回系统。

另外我想通知您,在 Externalizable 的情况下,没有强制使用无参数构造函数。我们可以通过在构造函数初始化期间将所有参数传递为 null 来创建对象,这样可以正常工作。

    ExternalizablePair1 copyOfPair = new ExternalizablePair1(null,null,null);

    FileInputStream inputStream = new FileInputStream(OUTPUT_FILE);
    ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
    copyOfPair.readExternal(objectInputStream);

        @Override
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
    this.key = in.readUTF();
    this.value = in.readUTF();
    this.emp = (Employee) in.readObject();
}
于 2017-10-12T03:16:39.180 回答