【问题标题】:Serialization serialVersionUID issue序列化serialVersionUID问题
【发布时间】:2015-04-21 19:57:57
【问题描述】:

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 扩展 ProjectException; ProjectException 扩展 Exception

我在所有 3 个异常类(客户端和服务器端)中指定了 serialVersionUID1L,以避免客户端出现反序列化问题。

否则我会得到

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 相关的异常?

我测试了几次,但对于LoanDocumentCommonDocumentObject.,我总是得到相同的serialVersionUID

我在 Server 和 Clinet 中使用下面提到的代码,并且在双方都得到相同的 serialVersionUID

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

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

【问题讨论】:

    标签: serialization ejb deserialization remote-access serialversionuid


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2017-07-29
      • 1970-01-01
      • 1970-01-01
      • 2017-07-15
      • 2010-11-22
      • 1970-01-01
      • 1970-01-01
      • 2015-06-19
      • 2011-09-21
      相关资源
      最近更新 更多