Найти в Дзене
DEBAGanov

Java 988. Какие существуют способы контроля за значениями десериализованного объекта?

При десериализации объекта в Java можно использовать разные способы контроля за значениями. Наиболее распространенными способами являются использование модификатора transient и методов readObject() и readResolve(). Пример использования метода readObject(): private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
in.defaultReadObject();
if (value < 0) {
throw new InvalidObjectException("Negative value");
}
} В данном примере при десериализации объекта будет проверяться, что значение поля value не является отрицательным. Пример использования метода readResolve(): private Object readResolve() throws ObjectStreamException {
if (this == INSTANCE) {
return INSTANCE;
} else {
return new Singleton();
}
} В данном примере при десериализации объекта будет проверяться, что объект является синглтоном и, если это не так, будет создан новый объект класса Singleton. 1606 вопрос-ответ по Java: https://github.com/DEBA

При десериализации объекта в Java можно использовать разные способы контроля за значениями. Наиболее распространенными способами являются использование модификатора transient и методов readObject() и readResolve().

  • Модификатор transient: если поле класса помечено модификатором transient, то оно не будет сериализоваться. Это позволяет контролировать, какие поля будут загружены при десериализации объекта.
  • Метод readObject(): при десериализации объекта вызывается метод readObject(), который позволяет контролировать значения загруженных полей. Этот метод должен быть определен в классе, который реализует интерфейс Serializable.
  • Метод readResolve(): после десериализации объекта вызывается метод readResolve(), который позволяет заменить десериализованный объект на другой объект. Этот метод также должен быть определен в классе, который реализует интерфейс Serializable.

Пример использования метода readObject():

private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
in.defaultReadObject();

if (value < 0) {
throw new InvalidObjectException("Negative value");
}
}

В данном примере при десериализации объекта будет проверяться, что значение поля value не является отрицательным.

Пример использования метода readResolve():

private Object readResolve() throws ObjectStreamException {
if (this == INSTANCE) {
return INSTANCE;
} else {
return new Singleton();
}
}

В данном примере при десериализации объекта будет проверяться, что объект является синглтоном и, если это не так, будет создан новый объект класса Singleton.

1606 вопрос-ответ по Java: https://github.com/DEBAGanov/interview_questions

Tелеграмм канал: https://t.me/DEBAGanov

Мое резюме: https://github.com/DEBAGanov