2011-10-14 5 views
1

일반적으로 jar를 빌드하고 ant와 함께 jar를 배포합니다. 그러나 이클립스에 코드를 추가하고 문제를 디버그해야하므로 main 클래스를 실행하려고했습니다 (일반적으로 모든 매개 변수와 함께 항아리를 실행하려고).이클립스에서만 역 직렬화 문제

그러나 나는이 문제를 겪고 있으며 잠시 벽을 향해 내 머리를 두 드렸습니다. 나는 466에 private static final serialVersionUID을 추가하려고 시도했다. 나는 또한 경고를 무시하기 위해 주석을 추가하고 1L로 설정하려고 시도했다.

그러나 이는 계속 InvalidClassException을 던집니다.

어쨌든 이클립스가 개미가 빌드하는 java -jar myjar.jar처럼 행동하게 만들 수 있습니까? 특히 이것이 여기에서 특별히 일어나고있는 이유가 있습니까? (jar를 실행하는 데 사용하는 것과 동일한 JVM입니다.)

java.rmi.UnmarshalException: error unmarshalling return; nested exception is: 
    java.io.InvalidClassException: com.blah.MyClass local class incompatible: stream classdesc serialVersionUID = 46644259037142, local class serialVersionUID = -175274031382959 

고마워요!

답변

1

항아리에 다른 버전의 클래스가있는 것 같습니다. 두 클래스가 일치하는지 확인하십시오 (이 데이터는이 데이터가 직렬화 된 것과 동일한 버전 임).

이것은 어떤 사람들은 자바 직렬화를 싫어하는 이유 중 하나)

1

조금이라도 명시 적으로 동일한 버전을 지정하지 않는 직렬화 클래스는 SUID 변경됩니다 변경. 이 클래스를 사용하여 이전 버전으로 만든 영구 객체를 비 직렬화하면 표시되는 오류가 발생합니다.

개체를 serialize/deserialize하는 방법이 명확하지 않지만 RMI 클라이언트 - 서버 클래스 버전 문제를 추측하고 있습니다. 클래스가 클라이언트 & 서버에 모두 배포 되었습니까?

0

Eclipse 컴파일러는 javac와 동일한 serialVersionUID를 생성하지 않습니다 (here 참조). 당신이 javac의 및 이클립스 컴파일러 betwwen 상호 운용성을 원하는 경우, 작동, 그들을 모든 직렬화 클래스에

public static final long serialVersionUID = ...; 

을 정의합니다.