Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

HashMap Serializability

HashMap implements the Serializable interface; so it can be serialized. I have looked at the implementation of HashMap and the Entry[] table is marked as transient. Since the Entry[] table is the one that stores the entire contents of the Map and if it cannot be serialized, how is the Map constructed back during de-serialization

like image 975
java_geek Avatar asked Aug 18 '11 07:08

java_geek


People also ask

What is HashMap serialization?

Hashmap: A HashMap stores items in key/value pairs, and we can access them by an index of another type (such as a string). Now to serialize anything, you have to implement the java. io. Serializable interface and HashMap also implements the Serializable interface.

Can you serialize a HashMap in Java?

HashMap class is serialized by default which means we need not to implement Serializable interface in order to make it eligible for Serialization. In this tutorial we will learn How to write HashMap object and it's content into a file and How to read the HashMap object from the file.

Is a Java map Serializable?

Serialization converts a Java object into a stream of bytes, which can be persisted or shared as needed. Java Maps are collections that map a key Object to a value Object, and are often the least intuitive objects to serialize.

Is concurrent HashMap Serializable?

As other already said, HashMap is Serializable , but the Map or Collection interface doesn't force the implementation of every collection to be "serializable".


2 Answers

If you look at the source you will see that it does not rely on the default serialization mechanism, but manually writes out all the entries (as an alternating stream of keys and values):

/**   * 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());                 }             }         } 

This is more compact than the array, which can contain many empty entries and link chains and overhead for Map$Entry wrappers.

Note that it still invokes defaultWriteObject for the "easy" fields. In order for that to work, it has to mark everything else as transient.

like image 64
Thilo Avatar answered Oct 07 '22 04:10

Thilo


HashMap takes care of its own serialization through the use of the writeObject and readObject methods.

like image 31
Ronald Wildenberg Avatar answered Oct 07 '22 04:10

Ronald Wildenberg