0

Clinet 运行在 JVM A 中,Server 运行在 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扩展CommonExceptionCommonException扩展ProjectExceptionProjectException延伸Exception

我在所有 3 个异常类(客户端和服务器端)中指定了一个serialVersionUID值,1L以避免客户端的反序列化问题。

否则我会得到

java.io.InvalidClassException: com.abc.common.ProjectException; local class incompatible: stream classdesc serialVersionUID = 354159461886461208, local class serialVersionUID = -5937350397277039691

因此,在所有 3 个类中提到 1L(serialVersionUID = 1L)解决了这个问题。

现在LoanDocument对象扩展CommonDocumentObject了,但没有一个具有serialVersionUID或实现Serializable接口。

但是当我们在客户端取得成功时,由于反序列化LoanDocument[],我没有得到任何相关的异常?serialVersionUID

我测试了几次,但我总是得到相同serialVersionUIDLoanDocument结果CommonDocumentObject.

我在 Server 和 Clinet 中使用了下面提到的代码,并且serialVersionUID双方总是相同的。

但在以下情况下总是不同的BusinessServicesException.

Class loanDocClass = LoanDocument.getClass();
long uid = ObjectStreamClass.lookup(loanDocClass).getSerialVersionUID();
4

1 回答 1

0

当我们LoanDocument[]在客户端成功时,由于反序列化,我没有收到任何与 serialVersionUID 相关的异常?

因为在部署到服务器和部署到客户端之间,您没有对该类进行任何更改。在其他情况下,你有。

于 2015-02-20T08:56:10.833 回答