Сериализуемый и экстернализуемый. Разница в вызове конструктора при десериализации
Я прочитал следующую статью:
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();
}