【发布时间】:2015-04-21 19:57:57
【问题描述】:
Clinet 在 JVM A 中运行,Server 在 JVM B 中运行。 从客户端到服务器的所有 EJB 调用。
现在我期望在客户端的 2 个对象中的任何一个。
-
LoanDocument数组或
-
BusinessServicesExceptionpublic 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 个类中提到 1L (serialVersionUID =1L) 解决了这个问题。
现在LoanDocument 对象扩展了CommonDocumentObject,但没有一个具有serialVersionUID 或实现Serializable 接口。
但是当我们在客户端成功LoanDocument[] 时,由于反序列化,我没有收到任何与serialVersionUID 相关的异常?
我测试了几次,但对于LoanDocument 和CommonDocumentObject.,我总是得到相同的serialVersionUID
我在 Server 和 Clinet 中使用下面提到的代码,并且在双方都得到相同的 serialVersionUID。
但在BusinessServicesException.的情况下总是不同
Class loanDocClass = LoanDocument.getClass();
long uid = ObjectStreamClass.lookup(loanDocClass).getSerialVersionUID();
【问题讨论】:
标签: serialization ejb deserialization remote-access serialversionuid