Я прочитал следующую статью:
http://javapapers.com/core-java/externalizable-vs-serializable/
При де-сериализации объекта (реконструкция) для восстановления объекта используется открытый конструктор без аргументов. В случае Serializable, вместо использования конструктора, объект повторно consturcted с использованием данных, считанных из ObjectInputStream.
Вышеупомянутый пункт впоследствии предусматривает, что объект Externalizable должен иметь открытый конструктор без аргументов. В случае Seriablizable это не обязательно.
Это правда о вызове конструктора, который
Сериализуемый:
В то время как десериализация вызывает конструктор ближайшего, не Serializable
предок только
Externalizable:
Хотя десериализация вызывает конструктор класса, который реализует интерфейс Externalizable
.
?
Да, в байтовом коде вы можете создать экземпляр объекта и вызвать любой конструктор в иерархии. По правде говоря, конструктор является специальным методом, и он даже вызывает его более одного раза.
Многие десериализаторы просто используют Unsafe.allocateInstance() и не вызывают никаких конструкторов. Это делается для минимизации побочных эффектов при десериализации.
Процесс десериализации в случае интерфейса 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();
}