序列化serialVersionUID问题

时间:2015-02-20 07:45:11

标签: serialization ejb deserialization remote-access serialversionuid

Clinet在JVM A中运行,服务器在JVM B中运行。 从客户端到服务器都有EJB调用。

现在客户端期望的两个对象中的任何一个。

  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; 
    
  3. 现在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相关的异常?

    我测试了几次,但serialVersionUIDLoanDocument

    总是相同CommonDocumentObject.

    我在Server和Clinet中使用下面提到的代码,并且我在两边总是相同serialVersionUID

    BusinessServicesException.

    的情况总是不同
    Class loanDocClass = LoanDocument.getClass();
    long uid = ObjectStreamClass.lookup(loanDocClass).getSerialVersionUID();
    

1 个答案:

答案 0 :(得分:0)

  

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

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