2017-05-07 16 views
1

enter image description here私はかなり新しいJavaです。クラスProductsSerializableです。私は私が何をしたか知らないが、私のプログラムが動作を停止し、私は、このエラーを与えた:serialversionUIDが一致しません

Exception in thread "main" java.io.InvalidClassException: cockeb.Product;  local class incompatible: stream classdesc serialVersionUID = 1288455942608122525, local class serialVersionUID = -558553967080513790 
at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:616) 
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1829) 
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1713) 
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1986) 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1535) 
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:422) 
at java.util.ArrayList.readObject(ArrayList.java:791) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:498) 
at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1058) 
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2122) 
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2013) 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1535) 
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:422 

私の周りを検索し、それを宣言し、それが今の私を助けていない方法を見つけました。私は新しいプロジェクトを開き、各クラスのテキストを非正常なプロジェクトからコピーして新しいプロジェクトに貼り付けるだけでも、同じエラーが表示されます。私はすべてのプロジェクトでこのエラーを受けています(彼らは同じSerializableクラスを使用します)。私はこれを行うために何をしたのかを知る必要があるので、それは再び起こらない、そして私はそれを修正するために何ができるでしょう。私は既にserialversionUIDを宣言しようとしましたが、うまくいかなかったのです。

製品のクラス

package cockeb; 

import java.io.Serializable; 
import java.math.BigDecimal; 

public class Product implements Comparable<Product>, Serializable { 

private String upc; 
private String shortDetails; 
private String longDetails; 
private BigDecimal price; 
private Integer stock; 

public String getUpc() { 
    return upc; 
} 

public void setUpc(String upc) { 
    this.upc = upc; 
} 

public String getShortDetails() { 
    return shortDetails; 
} 

public void setShortDetails(String shortDetails) { 
    this.shortDetails = shortDetails; 
} 

public String getLongDetails() { 
    return longDetails; 
} 

public void setLongDetails(String longDetails) { 
    this.longDetails = longDetails; 
} 

public BigDecimal getPrice() { 
    return price; 
} 

public void setPrice(BigDecimal price) { 
    this.price = price; 
} 

public Integer getStock() { 
    return stock; 
} 

public void setStock(Integer stock) { 
    this.stock = stock; 
} 

@Override 
public int compareTo(Product t) { 
    return this.getUpc().compareTo(t.getUpc()); 
} 

}

+0

商品クラスを投稿してください。 –

+0

これを見ていただきありがとうございます。私はこのエラーが発生することはありませんでした。 – Spectre6

答えて

1

あなたのクラスでこの行を入れて、すべてがOKでなければなりません!あなたはProductクラスでSerializableインターフェイスを実装して、特定のクラスにserialVersionUIDを定義しない場合は、別のマシンが自動生成さserialVersionUIDsもするクラスの異なるバージョンでも同じIDを使用するという保証がないためです

private static final long serialVersionUID = -558553967080513790L; 

異なる。 実際にデフォルトのserialVersionUIDの計算は、クラスの詳細に非常に敏感で、異なるJVM実装によって異なる可能性があり、デシリアライズ処理中に予期しないInvalidClassExceptionsが発生します。

編集がこれを読む - Serializableインタフェースのドキュメントを:

直列化可能クラスが明示的に serialVersionUIDのが宣言されていない場合は、直列化ランタイムが、に基づいて、そのクラスの デフォルトのserialVersionUIDの値を計算しますJava(TM)Object Serialization 仕様書に記載されているように、クラスの様々な側面 。しかし、強く デフォルトは計算がコンパイラの実装によって異なる場合があり、そして ので 直列化復元中に予期しないInvalidClassExceptionsにつながることができますクラス 詳細に非常に敏感であるserialVersionUIDのため、すべての 直列化可能クラスが明示的に、serialVersionUIDの値を宣言することをお勧めします。したがって、異なるjavaコンパイラ実装間で一貫したserialVersionUID 値を保証するには、シリアライズ可能な クラスで明示的なserialVersionUID値を宣言する必要があります。また、 は、明示的なserialVersionUID宣言では、できるだけ のprivate修飾子を使用することを強く推奨しています。そのような宣言は、 にのみ適用されるため、直ちに宣言するクラスserialVersionUIDフィールドは継承されたメンバーとして便利な ではありません。配列クラスは明示的に serialVersionUIDを宣言できないため、常にデフォルトの計算値を持ちますが、 配列クラスではと一致するserialVersionUID値の要件が放棄されます。

Good Luck!

+0

コメントは議論の対象外です。この会話は[チャットに移動]されています(http://chat.stackoverflow.com/rooms/143599/discussion-on-answer-by-mohammad-reza-khatami-serialversionuid-does-not-match)。 –

関連する問題