#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);
}