1

私は guava-14.0.1 を実行しており、次のコードがあります。

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

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

classifier は保持したいオブジェクトであり、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 とその逆はどちらもシリアライズ可能です。

しかし、ここでのこの議論は少し混乱しているように見えますか?

4

2 に答える 2

1

chrylis と Tasm が示唆するように、問題は Guava のバージョン間の不一致です。あるバージョンの Guava は、別のバージョンによってシリアル化されたオブジェクトを必ずしも読み取れるとは限りません。(出典: Guava のホームページ。次のように書かれています。「すべてのオブジェクトのシリアル化された形式は変更される可能性があります。これらを保持せず、ライブラリの将来のバージョンで読み取れると想定してください。」 )

以前は拡張していたが、現在は拡張HashBiMap AbstractBiMapていないため、バージョンが異なると推測できます。

(ちなみに、紛らわしい議論へのリンクは、プレーンな Java シリアライゼーションとは別の GWT シリアライゼーションに関するものであるため、紛らわしいです。ここでは関係ありません。その議論は、実際よりも明確にする必要があります。)

于 2013-09-30T15:59:19.330 に答える
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について話しているので、両方の場合で同じグアババージョンを使用していることを確認してください。

于 2013-09-30T10:13:24.343 に答える