Сериализуемость HashMap - PullRequest
       5

Сериализуемость HashMap

30 голосов
/ 18 августа 2011

HashMap реализует интерфейс Serializable;так что это может быть сериализовано.Я посмотрел на реализацию HashMap, и таблица Entry [] помечена как временная.Поскольку в таблице Entry [] хранится все содержимое карты, и если ее невозможно сериализовать, то как карта строится обратно во время десериализации

Ответы [ 3 ]

35 голосов
/ 18 августа 2011

Если вы посмотрите на источник , вы увидите, что он не использует механизм сериализации по умолчанию, а вручную записывает все записи (в виде чередующегося потока ключей и значений):

/**
  * Save the state of the <tt>HashMap</tt> instance to a stream (i.e.,
  * serialize it)
  *
  * @serialData The <i>capacity</i> of the HashMap (the length of the
  *             bucket array) is emitted (int), followed by the
  *             <i>size</i> (an int, the number of key-value
  *             mappings), followed by the key (Object) and value (Object)
  *             for each key-value mapping.  The key-value mappings are
  *             emitted in no particular order.
  */
      private void writeObject(java.io.ObjectOutputStream s)
             throws IOException
         {
             Iterator<Map.Entry<K,V>> i =
                 (size > 0) ? entrySet0().iterator() : null;

            // Write out the threshold, loadfactor, and any hidden stuff
            s.defaultWriteObject();

            // Write out number of buckets
            s.writeInt(table.length);

            // Write out size (number of Mappings)
            s.writeInt(size);

            // Write out keys and values (alternating)
            if (i != null) {
                while (i.hasNext()) {
                    Map.Entry<K,V> e = i.next();
                    s.writeObject(e.getKey());
                    s.writeObject(e.getValue());
                }
            }
        }

Это более компактно, чем массив, который может содержать много пустых записей, цепочек ссылок и накладных расходов для оболочек Map $ Entry.

Обратите внимание, что он по-прежнему вызывает defaultWriteObject для "простого"поля.Чтобы это работало, все остальное нужно пометить как transient.

9 голосов
/ 18 августа 2011

HashMap обеспечивает собственную сериализацию с использованием методов writeObject и readObject.

4 голосов
/ 18 августа 2011

HashMaps не сериализуют свои объекты Entry во время сериализации. Взгляните на его writeObject метод.

Javadocs объясняют:

Емкость HashMap (длина массива сегментов) равна emitted (int), за которым следует размер (int, номер ключа-значения сопоставления), а затем ключ (объект) и значение (объект) для каждого отображение значения ключа. Отображения ключ-значение выдаются не заказ.

Если вы посмотрите на метод readObject, вы увидите, как таблица Entry перестраивается с использованием размера, ключей и значений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...