【问题标题】:Serialize HashMap<String, Object> in Java在 Java 中序列化 HashMap<String, Object>
【发布时间】:2016-10-11 14:23:14
【问题描述】:

我正在尝试序列化HashMap&lt;String, Object&gt; 类型的对象。但是,我在运行时得到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


【解决方案1】:

HashMap 可以被序列化,但是你有 Object 作为值。这些对象可能像您的 SpellCheckTrainer 类一样 serializbale。使该类可序列化您可能会很好。注意:Sonarqube 代码分析仍会将其标记为 squid:S1948 的严重问题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-20
    • 2017-03-11
    • 1970-01-01
    • 2016-08-20
    • 1970-01-01
    • 2014-07-20
    相关资源
    最近更新 更多