2017-05-07 7 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

확인을해야 클래스와 모든 일에이 줄을 놔! 당신이 Product 클래스 Serializable 인터페이스를 구현하고 특정 클래스에 serialVersionUID를 정의하지 않는 경우, 다른 기계가 자동 생성 serialVersionUIDs는 것이다 클래스의 다른 버전에서 동일한 ID를 사용한다는 보장이 없기 때문에입니다

private static final long serialVersionUID = -558553967080513790L; 

다를 수 있습니다. 실제로 기본 serialVersionUID 계산은 클래스 세부 사항에 매우 민감하며 다른 JVM 구현과 다를 수 있으며 비 직렬화 프로세스 중에 예기치 않은 InvalidClassExceptions가 발생합니다. 직렬화 가능 클래스가 명시 적으로 직렬화 런타임 기반으로 그 클래스에 대한 기본 serialVersionUID의 값을 계산합니다하는 serialVersionUID를 선언하지 않는 경우

: Serializable 인터페이스의 문서 -

이 읽기 ​​편집 Java (TM) 객체 직렬화 사양에 설명 된대로 클래스의 다양한 측면 그러나, 강하게 기본이 계산이 컴파일러 구현에 따라 달라질 수 있습니다 클래스 세부 사항에 매우 민감하고, 따라서 직렬화 복원시에 예상치 못한는 InvalidClassExceptions가 발생할 수 있습니다 serialVersionUID의 이후의 모든 직렬화 가능 클래스가 명시 적으로 serialVersionUID의 값을 선언하는 것이 좋습니다. 따라서 서로 다른 Java 컴파일러 구현에서 일관된 serialVersionUID 값을 보장하려면 serializable 클래스가 명시 적 serialVersionUID 값을 선언해야합니다. 또한 은 명시 적 serialVersionUID 선언에서 가능한 경우 private 한정자를 사용하는 것이 좋습니다. 이러한 선언은 에만 적용되므로 즉시 선언 된 클래스 serialVersionUID 필드는 상속 된 멤버로 사용하면 이 아닙니다. 배열 클래스는 명시 적으로 serialVersionUID를 선언 할 수 없으므로 항상 기본 계산 값을 갖지만 배열 클래스에서는 serialVersionUID 값과 일치하는 요구 사항이 포기됩니다.

행운을 빌어 요!

+0

댓글은 확장 토론이 아닙니다. 이 대화는 [채팅으로 이동되었습니다] (http://chat.stackoverflow.com/rooms/143599/discussion-on-answer-by-mohammad-reza-khatami-serialversionuid-does-not-match). –