番石榴是hashbimap可序列化?

时间:2013-09-30 09:46:18

标签: java serialization guava

我正在运行guava-14.0.1并且我有以下代码:

public class LinearClsMalletAdaptor extends Classifier implements Serializable{
    private BiMap<Double, String> indexToLabel;
.........

classifier = new LinearClsMalletAdaptor(sp, model, hashBiMap.inverse());

分类器是我希望坚持的对象,我在Mac上序列化和反序列化没有问题。

但是,使用我发送给朋友的同一序列化文件,他在反序列化过程中遇到了Windows机器上的以下问题:

java.lang.ClassCastException: com.google.common.collect.HashBiMap cannot be cast to 

    com.google.common.collect.AbstractBiMap
           at com.google.common.collect.AbstractBiMap$Inverse.readObject(AbstractBiMap.java:390)
           at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
           at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
           at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
           at java.lang.reflect.Method.invoke(Method.java:597)
           at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:969)
           at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1848)
           at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752)
           at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328)
           at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1946)
           at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1870)
           at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752)
           at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328)
           at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350)
           at java.util.HashMap.readObject(HashMap.java:1030)
           at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
           at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
           at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
           at java.lang.reflect.Method.invoke(Method.java:597)
           at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:969)
           at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1848)
           at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752)
           at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328)
           at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1946)
           at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1870)
           at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752)
           at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328)
           at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350)
           at sg.edu.astar.i2r.batc.projects.getme.core.classify.hier.topdown.TopDownClassificationAnnotator.initialize(TopDownClassificationAnnotator.java:63)
           at 

如果他在自己的机器上执行序列化,则不会发生此问题。我有点困惑,HashBiMap类可序列化吗? api文档说

  

HashBiMap及其逆序都是可序列化的。

但是这里的discussion似乎有点迷惑?

2 个答案:

答案 0 :(得分:1)

正如chrylis和Tasm所说,问题是番石榴版本之间的不匹配。一个版本的Guava不一定能读取另一个版本的序列化对象。 (来源:番石榴主页,上面写着:"Serialized forms of ALL objects are subject to change. Do not persist these and assume they can be read by a future version of the library."

您可以推断出版本不同,因为HashBiMap used to扩展AbstractBiMapno longer确实存在。

(顺便说一句,你到the confusing discussion的链接令人困惑,因为它是关于GWT序列化的,它与普通的Java序列化是分开的。这里没有涉及。讨论应该比它更清楚。 )

答案 1 :(得分:0)

HashBiMap是可序列化的

public final class HashBiMap<K, V> extends AbstractMap<K, V> implements BiMap<K, V>, Serializable

还有另一个问题看看堆栈。您正在尝试反序列化不同的对象。

我的意思是这个文件包含另一个类AbstractBiMap,你期待BiMap。

BiMap与AbstractBiMap没有任何共同之处。

只有EnumBiMap EnumHashBiMap和Inverse扩展了AbstractBiMap

当然我在谈论番石榴14.0.1所以请确保在两种情况下都使用相同的番石榴版本。