2017-02-25 6 views
1

シリアル化可能なインターフェイスを実装するクラスがあります。私はシリアル化し、別のアプリケーションによって格納されているオブジェクトを逆シリアル化しようとしています。 serialversionuidを使用しないクラスの逆シリアル化

// does not have serialversionuid defined. 
public Class Pet implements Serializable { 
    private count;  
    private date; 

    // getters & setters 
} 

は、私は自分のアプリケーションで定義されている同様のクラスを持っている - 他のアプリケーションで保存されたオブジェクトは、以下に類似したクラスによって作成されます。 Mineにはserialversionuidも定義されていません。私はこのオブジェクトを逆シリアル化しようとすると、私はこのようなエラーを参照してください - java.io.InvalidClassException非整列化しながら、

IOエラーが発生しました: ローカルクラス非互換:ストリーミングclassdescのserialVersionUID = -3565652537049376317、ローカルクラスのserialVersionUID =を-4242367052120288379

私は、データをシリアライズして格納するクラスを制御できません。オブジェクトをデシリアライズできるようにクラスを変更する方法はありますか?

+1

私はクラスが異なるかもしれないと信じています、あなたはどのクラスが使用されているのかを見るためのアクセス権がありますか? –

+0

ありがとう@EduardoDennis。あなたは正しいです。さらに2つの方法がありました。 –

答えて

3

this仕様の4.6節にあるように、シリアライズ可能クラスでserialVersionUIDが指定されていない場合、JVMはクラスの詳細に基づいて1つを選択します。しかし、(上記のリンクで説明した)アルゴリズムは、クラスの詳細に非常に敏感です。また、アルゴリズムはクラス定義を反映するバイトのストリーム上で直接動作するため、コンパイラの実装にも依存することがあります。あなたのケースでは

、あなたがデマーシャリング時に無効なクラスのバージョンのエラーを取得するので、それは以下の2点の一つ意味:あなたが他で使用するクラスに非常に近いと思いますが、

  1. あなたのクラスアプリケーションは、まだ少し異なります。アルゴリズムを再度確認してください。クラスの詳細に非常に敏感です。
  2. 他のアプリケーションによってシリアル化されたオブジェクトは、別のコンパイラによって生成されたクラス定義から作成されました。

このオブジェクトを逆シリアル化できるようにするには、上記の2つの可能性を調べて、不一致を取り除く必要があります。

+0

ありがとう@VHS。私のクラスには2つの余分なメソッドがあることがわかります。 –

1

これは問題ではありません。クラスが異なるため、serialVersionUIDは一致しません。

+0

ありがとう@エドゥアルドデニス –

+0

よろしくお願いします! –

関連する問題