Как можно де-сериализовать переходные поля Java обратно к их исходным значениям?

#java #serialization #deserialization

Вопрос:

Насколько я понимаю, временные и статические поля объектов Java не могут быть сериализованы JVM, пока объект сериализуется в источнике. Как после сериализации эти поля могут быть возвращены к их исходным значениям, пока объект де сериализуется в пункте назначения?

Комментарии:

1. Переходные поля должны быть пересчитаны заново.

2. @AndyTurner Не могли бы вы указать мне пример в Интернете или любую кодовую базу на Github?

3. HashSet внутренняя карта является временной. Вы можете видеть, как он строится readObject .

Ответ №1:

Как можно де-сериализовать переходные поля Java обратно к их исходным значениям?

Они не могут быть десериализованы: они по определению не включены в сериализованное представление экземпляра.

Вместо этого они пересчитываются.


Примером этого является внутренняя карта в HashSet . На самом деле нет необходимости хранить «сопоставление» содержимого Set ; даже нет необходимости хранить «набор» (например, тот факт, что дубликатов нет).

Сериализованное представление HashSet — это просто элементы — оно очень похоже на сериализованный массив-это просто один объект за другим.

 // From HashSet.writeObject():

// Write out all elements in the proper order.
for (E e : map.keySet())
  s.writeObject(e);
 

При десериализации эти объекты считываются один за другим и помещаются в Map :

 // From HashSet.readObject():

// Read in all elements in the proper order.
for (int i=0; i<size; i  ) {
  @SuppressWarnings("unchecked")
    E e = (E) s.readObject();
  map.put(e, PRESENT);
}