2014-12-27 2 views
-1
public class AddClient implements Serializable { 
    public static void main(String args[]) { 
     try { 
      String addServerURL = "rmi://" + "127.0.0.1" + "/AddServer"; 
      AddServerIntf addServerIntf = (AddServerIntf) Naming.lookup(addServerURL); 
      System.out.println("msg from inside"+addServerIntf.register(new AddClient())); 
     } catch (Exception e) { 
      System.out.println("Exception: " + e); 
     } 
    } 
} 

나는이 수업을하고는 제대로 그 작업을 작업,하지만 내가 원하는 때 그것은 예외 생성RMI 예외 : java.lang.InvalidClassException

public void retrive(String msg) { 
    System.out.println(msg); 
} 

처럼하는 방법을 추가

java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
java.io.InvalidClassException: rmi.AddClient; local class incompatible: stream classdesc serialVersionUID = 7584986215301760999, local class serialVersionUID = 9065682220695232722 

하지만 어디서나 메서드 호출을 사용하지 않았지만 예외가 발생했습니다. 나는 이런 종류의 문제에 직면 한 적이 없으므로 내가해야 할 일을 말해 줄 수있다.

+0

클라이언트와 서버 모두에서 공통 JAR이 필요합니다. 서버 JAR을 업데이트하지 못한 것 같습니다. – duffymo

+0

이것은 ***이 아닌 'InvalidArgumentException'입니다. 정확하십시오. – EJP

답변

1

예외는 문제를 설명하고 있습니다. 클라이언트가 직렬화 된 객체를 비 정렬 화하려고 시도하고 있지만 직렬 버전 식별자가 일치하지 않아서 연결할 수 없습니다.

즉, 서버가 클라이언트가 비 정렬 화하는 것보다 다른 버전의 AddClient 클래스를 직렬화했다는 의미입니다.

@duffymo가 정확합니다. 문제를 해결하기 위해 클라이언트와 서버 모두 클래스 경로에 동일한 버전의 AddClient 클래스가 있어야합니다.