Подтвердить что ты не робот

Чтобы инициализировать переходное поле, какое самое простое решение

class MyClass implements Serializable {
  transient int myTransient;
  //Other variables
}

Когда я восстанавливаю этот класс, я хочу инициализировать myTransient вручную, но в противном случае я просто хочу использовать сериализацию по умолчанию.

Как я могу вставить метод init() в процесс восстановления объекта без повторной записи всего механизма сериализации, как мне кажется, Externalizable?

4b9b3361

Ответ 1

Внедрить метод readObject():

private void readObject(java.io.ObjectInputStream in)
    throws IOException, ClassNotFoundException {
    in.defaultReadObject();
    myTransient = ...;
}

Из javadoc:

Классы, требующие специальной обработки во время процесса сериализации и десериализации, должны реализовывать специальные методы с этими точными сигнатурами:

private void readObject (java.io.ObjectInputStream in)      бросает IOException, ClassNotFoundException;

Метод readObject отвечает за чтение из потока и восстановление полей классов. Он может вызвать in.defaultReadObject для вызова механизма по умолчанию для восстановления нестатических и непереходных полей объекта. Метод defaultReadObject использует информацию в потоке для назначения полей объекта, сохраненного в потоке, с соответствующими именами в текущем объекте. Это обрабатывает случай, когда класс развился, чтобы добавить новые поля. Этот метод не должен касаться состояния, принадлежащего его суперклассам или подклассам. Состояние сохраняется путем записи отдельных полей в ObjectOutputStream с использованием метода writeObject или с использованием методов для примитивных типов данных, поддерживаемых DataOutput.

См. также: