readObject () и readResolve () для восстановления временных полей - PullRequest
7 голосов
/ 10 мая 2010

Согласно Сериализуемый javadoc, readResolve() предназначен для замены объекта, считанного из потока. Но, конечно (?) У вас нет для замены объекта, поэтому можно использовать его для восстановления переходных полей и возврата исходной ссылки, например:

private Object readResolve() {
    transientField = something;
    return this;
}

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

private void readObject(ObjectInputStream s) {
    s.defaultReadObject();
    transientField = something;
}

Есть ли какая-либо причина выбирать одно из другого, когда оно используется только для восстановления переходных полей? На самом деле я склоняюсь к readResolve(), потому что он не нуждается в параметрах, и поэтому его можно легко использовать и при построении объектов «нормально», в конструкторе, например:

class MyObject {

    MyObject() {
        readResolve();
    }

    ...
}

Ответы [ 2 ]

4 голосов
/ 20 ноября 2011

Используйте readResolve. Метод readObject позволяет настроить способ чтения объекта, если формат отличается от ожидаемого по умолчанию. Это не то, что вы пытаетесь сделать. Метод readResolve, как следует из его названия, предназначен для разрешения объекта после его прочтения, и его цель состоит в том, чтобы точно разрешить состояние объекта, которое не восстанавливается после десериализации. Это то, что вы пытаетесь сделать. Вы можете вернуть «this» из readResolve.

4 голосов
/ 10 мая 2010

Фактически readResolve был определен, чтобы предоставить вам более высокий контроль над тем, как объекты десериализуются. Как следствие, вы можете делать все, что захотите (включая установку значения для переходного поля).

Однако я представляю, что ваше переходное поле установлено с постоянным значением. В других местах это был бы верный признак того, что что-то не так: либо ваша область не является такой преходящей, либо ваша модель данных основана на ложных предположениях.

...