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

1

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

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

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

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

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

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

?

  • 0
    Проигнорируйте произвольное интернет-барахло и перейдите прямо к Спецификации Сериализации Объекта, которая согласуется с вашими утверждениями.
Теги:
serialization
externalizable

2 ответа

1
Лучший ответ

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

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

1

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

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

Также я хотел бы сообщить вам, что нет обязательного наличия конструктора no-arg в случае 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();
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню