2017-05-07 12 views
1

enter image description here Ich bin ziemlich neu in Java und ich habe eine Klasse Products das ist Serializable. Ich weiß nicht, was ich tat, aber meine Programme aufgehört zu arbeiten und gaben mir diesen Fehler:serialversionUID passt nicht

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 

Ich suchte herum und Wege gefunden, um es zu erklären, aber das macht mir jetzt nicht helfen. Ich ging sogar so weit, ein neues Projekt zu öffnen und nur den Text in jeder Klasse aus dem nicht arbeitenden Projekt zu kopieren und in das neue Projekt einzufügen, aber ich bekomme immer noch denselben Fehler. Ich erhalte diesen Fehler über alle meine Projekte (sie verwenden die gleiche Serializable Klasse) Ich muss wissen, was ich getan habe, dies zu tun, damit es nicht wieder passiert, und was ich tun kann, um es zu beheben. Ich habe bereits versucht, die serialversionUID zu deklarieren und das hat nicht funktioniert.

Produktklasse

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

posten Sie bitte Ihre Produktklasse. –

+0

danke für das Betrachten, ich hatte nie diesen Fehler vor – Spectre6

Antwort

1

Setzen Sie diese Zeile in Ihrer Klasse und sollte alles in Ordnung sein!

private static final long serialVersionUID = -558553967080513790L; 

Das ist, weil Sie Serializable Schnittstelle in der Product Klasse implementiert und wenn Sie nicht serialVersionUID in der speziellen Klasse definieren Sie, gibt es keine Garantie, dass verschiedene Maschinen auch die gleiche ID verwenden in verschiedenen Versionen der Klasse die automatisch generierten serialVersionUIDs wird auch Sei anders. Eigentlich Die standardmäßige serialVersionUID-Berechnung reagiert sehr empfindlich auf Klassendetails und kann von verschiedenen JVM-Implementierungen abweichen und zu unerwarteten InvalidClassExceptions während des Deserialisierungsprozesses führen.

Herausgegeben Lesen Sie diese - Serializable-Schnittstelle des docs:

Wenn ein serializable Klasse nicht explizit ein erklären serialVersionUID, dann ist die Serialisierung Laufzeit berechnet dann einen Standard serialVersionUID Wert für diese Klasse basiert auf verschiedene Aspekte der Klasse, wie in der Java (TM) Objektserialisierung Spezifikation beschrieben. Es wird jedoch dringend empfohlen, dass alle serializable Klassen explizit serialVersionUID Werte erklären, da der Standard serialVersionUID Berechnung Klasse Details sehr empfindlich ist, die auf Compiler-Implementierungen variieren abhängig und kann somit in unerwarteten InvalidClassExceptions während Deserialisierung führen. Um einen konsistenten Wert für serialVersionUID über verschiedene Java-Compiler-Implementierungen zu garantieren, muss daher eine serialisierbare Klasse einen expliziten serialVersionUID-Wert deklarieren. Es ist auch stark empfohlen, dass explizite serialVersionUID-Deklarationen den privaten Modifizierer, wo möglich, verwenden, da solche Deklarationen gelten nur für die sofort deklarierende Klasse - serialVersionUID Felder sind nicht nützlich als geerbte Mitglieder. Array-Klassen können keine explizite serialVersionUID deklarieren, so dass sie immer den berechneten Standardwert haben, aber die Anforderung für die übereinstimmenden serialVersionUID-Werte entfällt für Array-Klassen.

Viel Glück!

+0

Kommentare sind nicht für längere Diskussion; Diese Konversation wurde [in den Chat verschoben] (http://chat.stackoverflow.com/rooms/143599/discussion-on-answer-by-mohammad-reza-khatami-serialversionuid-does-not-match). –