【发布时间】:2016-10-11 14:23:14
【问题描述】:
我正在尝试序列化HashMap<String, Object> 类型的对象。但是,我在运行时得到NotSerializableException。这是我用于序列化的代码
public void WriteModel(String modelFile, HashMap<String, Object> o) {
try {
ObjectOutputStream os = new ObjectOutputStream (new FileOutputStream (modelFile));
os.writeObject(o);
os.close();
}
catch (Exception e) {
System.out.println ("Error in saving model " + modelFile + ": " + e);
e.printStackTrace();
}
}
HashMap 具有int 作为值或以下类型的对象
public class suggestMenu implements Serializable {
private static final long serialVersionUID = -8558253517294665710L;
public List<Integer> suggestions = new ArrayList<Integer>();
public int freq = 0;
}
所以基本上 HashMap 中包含的所有对象都是可序列化的。 我做错了什么?这与 HashMap 包含不止一种类型的事实有关吗? 考虑到几乎不可能改变它的结构,那么序列化它的可能方式是什么?
这是错误的完整堆栈跟踪
Error in saving model /home/ritesh/Documents/spell-checker/dict_ser.ser: java.io.NotSerializableException: spell.SpellCheckTrainer
java.io.NotSerializableException: spell.SpellCheckTrainer
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1183)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1547)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1508)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1431)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1177)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:347)
at java.util.HashMap.writeObject(HashMap.java:1129)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:988)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1495)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1431)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1177)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:347)
at spell.SpellCheckTrainer.WriteModel(SpellCheckTrainer.java:254)
at spell.SpellCheckTrainer.CreateDictionary(SpellCheckTrainer.java:246)
at spell.SpellCheckTrainer.main(SpellCheckTrainer.java:55)
【问题讨论】:
-
@ritesh 它说
spell.SpellCheckTrainer,这个类可以序列化吗? -
我有一种预感:映射中的一个值是一个内部类,它隐式包含对其封闭类
SpellCheckTrainer的引用,该类不可序列化。解决方案:改用静态嵌套类。不要序列化内部类。 -
@Dev.Joel 感谢您指向帖子!它有助于我更好地理解 HashMap 的序列化过程,但我仍然不太明白为什么它在这种情况下会失败以及如何
-
@ThomasJungblut,没有 SpellCheckTrainer 不可序列化。所以这就是它失败的原因。非常感谢您的帮助!
标签: java serialization hashmap