java HashMap 不可序列化
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/32790025/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
HashMap not Serializable
提问by datree
HashMap
with Serializable
key/value is supposed to be Serializable
.
HashMap
与Serializable
键/值应该是Serializable
。
But it's not working for me. Tried some other IO streams. None works.
但这对我不起作用。尝试了一些其他的 IO 流。没有工作。
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
回答by John Bollinger
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.
异常消息准确地告诉您问题是什么:您正在尝试序列化 class 的实例SimpleSerializationTest
,而该类不可序列化。
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.
为什么?好吧,您已经创建了一个 的匿名内部类SimpleSerializationTest
,一个扩展了HashMap
,并且您正在尝试序列化该类的一个实例。内部类始终引用其外部类的相关实例,默认情况下,序列化将尝试遍历这些实例。
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 anyclass 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 {
HashMap<String, String> hmap = new HashMap<String, String>();
hmap.put(new String("key"), new String("value"));
// ...
}
回答by fabien t
A working version of your code :
您的代码的工作版本:
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInput;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.HashMap;
import org.junit.Test;
import junit.framework.Assert;
public class SimpleSerializationTest implements Serializable{
@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);
HashMap<String, String> o = (HashMap<String, String>) in.readObject();
bis.close();
if (in != null) {
in.close();
}
Assert.assertEquals(hmap, o);
}
}