Сериализуемый и экстернализуемый. Разница в вызове конструктора при десериализации

Я прочитал следующую статью:

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

В десериализации объекта (повторное воссоздание) общедоступный конструктор без аргументов используется для реконструкции объекта. В случае Serializable, вместо использования конструктора, объект восстанавливается с использованием данных, считанных из ObjectInputStream.
Вышеуказанный пункт впоследствии обязывает открытый объект Externalizable иметь открытый конструктор без аргументов. В случае Seriablizable это не обязательно.

Это правда о вызове конструктора, который

Сериализуемый:
В то время как десериализация вызывает конструктор ближайшего Serializable только предок

Externalizable:
В то время как десериализация вызывает конструктор класса, который реализует Externalizable только интерфейс

?

2 ответа

Решение

Да, в байтовом коде вы можете создать экземпляр объекта и вызвать любой конструктор в иерархии. По правде говоря, конструктор - это особый метод, и его даже называют несколько раз.

Многие десериализаторы просто используют Unsafe.allocateInstance() и не вызывают никаких конструкторов. Это сделано, чтобы минимизировать побочные эффекты при десериализации.

Процесс десериализации в случае интерфейса Externalizable зависит от переданного конструктора, и мы явно создаем его объект, но в случае интерфейса Serializable объект создается ObjectStreamClass.newInstance(). Таким образом, здесь нет роли конструктора.

После этого он внутренне хранит массив данных / объектов (любое настраиваемое поле, строка, int ... и т. Д.), Который связан с переданным объектом inputStream. Все элементы массива (которые хранят состояние объекта) позже устанавливаются в объект, и он возвращается в систему.

Также я хотел бы сообщить вам, что не обязательно иметь конструктор без аргументов в случае Externalizable. Мы можем создать объект, передав все аргументы как нулевые во время инициализации конструктора, и это будет работать нормально.

    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();
}
Другие вопросы по тегам