HashMap not Serializable

19,122

The exception message tells you exactly what the problem is: you are trying to serialize an instance of class SimpleSerializationTest, and that class is not serializable.

Why? Well, you have created an anonymous inner class of SimpleSerializationTest, one that extends HashMap, and you are trying to serialize an instance of that class. Inner classes always have references to the relevant instance of their outer class, and by default, serialization will try to traverse those.

I observe that you use a double-brace {{ ... }} syntax as if you think it has some sort of special significance. It is important to understand that it is actually two separate constructs. The outer pair of braces appearing immediately after a constructor invocation mark the boundaries of the inner class definition. The inner pair bound an instance initializer block, such as you can use in any class body (though they are unusual in contexts other than anonymous inner classes). Ordinarily, you would also include one or more method implementations / overrides inside the outer pair, either before or after the initializer block.

Try this instead:

    public void testHashMap() throws Exception {
        Map<String, String> hmap = new HashMap<String, String>();

        hmap.put(new String("key"), "value");

        // ...
    }
Share:
19,122
datree
Author by

datree

Updated on August 05, 2022

Comments

  • datree
    datree almost 2 years

    HashMap with Serializable key/value is supposed to be Serializable.

    But it's not working for me. Tried some other IO streams. None works.

    Any suggestion?

    Test code

    public class SimpleSerializationTest {
        @Test
        public void testHashMap() throws Exception {
            HashMap<String, String> hmap = new HashMap<String, String>() {{
                put(new String("key"), new String("value"));
            }};
    
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            ObjectOutput out = null;
            out = new ObjectOutputStream(bos);
            out.writeObject(hmap);
            byte[] yourBytes = bos.toByteArray();
            if (out != null) {
                out.close();
            }
            bos.close();
    
            ByteArrayInputStream bis = new ByteArrayInputStream(yourBytes);
            ObjectInput in = null;
            in = new ObjectInputStream(bis);
            Object o = in.readObject();
            bis.close();
            if (in != null) {
                in.close();
            }
    
            assertEquals(hmap, o);
        }
    }
    

    Stack trace

    java.io.NotSerializableException: SimpleSerializationTest
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)
        at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
        at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
        at SimpleSerializationTest.testHashMap(SimpleSerializationTest.java:18)
    
    Process finished with exit code 0