我正在尝试序列化一个类型为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)发布于 2018-12-28 11:58:27
HashMap可以序列化,但对象作为值。这些对象可能是,而不是像SpellCheckTrainer类那样的序列化。使该类可序列化,您可能会很好。注意: Sonarqube代码分析仍然会将其标记为squid:s 1948中的一个关键问题。
https://stackoverflow.com/questions/39979492
复制相似问题