0

Clinet は JVM A で実行され、サーバーは JVM B で実行されます。クライアントからサーバーへのすべての EJB 呼び出しがあります。

クライアント側で期待される2つのオブジェクトのいずれか。

  1. の配列LoanDocument

    また

  2. 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();
4

1 に答える 1

0

クライアント側で成功LoanDocument[]すると、逆シリアル化が原因で serialVersionUID 関連の例外が発生しませんか?

サーバーへの展開とクライアントへの展開の間に、そのクラスに変更を加えていないためです。他のケースでは、あなたは持っていました。

于 2015-02-20T08:56:10.833 に答える