Clinet は JVM A で実行され、サーバーは JVM B で実行されます。クライアントからサーバーへのすべての EJB 呼び出しがあります。
クライアント側で期待される2つのオブジェクトのいずれか。
の配列
LoanDocument
また
BusinessServicesException
public interface LoanViewerServicesLocal extends EJBLocalObject { public LoanDocument[] getDocByLoanNumber (String loanNum) throws BusinessServicesException; public interface LoanViewerServices extends EJBObject { public LoanDocument[] getDocByLoanNumber (String loanNum) throws RemoteException,BusinessServicesException;
BusinessServicesException
拡張するようになりましCommonException
た。CommonException
拡張しProjectException
ます。ProjectException
伸びException
ます。
クライアント側での逆シリアル化の問題を回避するために、3 つの例外クラスすべて (クライアント側とサーバー側の両方) にserialVersionUID
値を指定しました。1L
そうでなければ私は得る
java.io.InvalidClassException: com.abc.common.ProjectException; local class incompatible: stream classdesc serialVersionUID = 354159461886461208, local class serialVersionUID = -5937350397277039691
したがって、3 つのクラスすべて (serialVersionUID =1L) で 1L を指定すると、問題が解決します。
現在、LoanDocument
オブジェクトは拡張されていますが、インターフェイスCommonDocumentObject
を持っているserialVersionUID
か実装していません。Serializable
しかしLoanDocument[]
、クライアント側で成功するとserialVersionUID
、逆シリアル化のために関連する例外が発生しませんか?
私は何度かテストしましたが、私はいつも同じようserialVersionUID
に forLoanDocument
と in を取得しますCommonDocumentObject.
サーバーとクリネットで以下のコードを使用するとserialVersionUID
、両側で常に同じになります。
ただし、次の場合は常に異なりますBusinessServicesException.
Class loanDocClass = LoanDocument.getClass();
long uid = ObjectStreamClass.lookup(loanDocClass).getSerialVersionUID();