为什么EJB需要实现Serializable接口?

7
有什么原因导致EJB类需要实现序列化呢? 我听说这与RMI在幕后使用有关。我知道RMI(远程方法调用)是如何工作的,服务器端注册了一个远程对象,只有远程对象的存根被发送到客户端,而不是整个对象。
因此,在RMI应用程序中,远程对象的方法需要使用可序列化的参数和返回值,因为它们会被发送到网络上,但不会发送远程对象本身。

所有的EJB方法参数和返回值都必须是可序列化的。最简单的方法是确保你的所有类都实现了java.io.Serializable接口。 - Ravindra babu
没错,那就是我的意思,不过我问的是EJB本身是否需要实现Serializable接口。 - user107986
EntityBean、MessageDrivenBean、SessionBean:都继承了可序列化的EnterpriseBean。 - Ravindra babu
我不明白。你说所有的EJB方法参数和返回值都必须是可序列化的。是的,我同意这一点。但我想问的是,EJB类也需要可序列化吗?如果是,为什么?我的类实现了可序列化并不能自动使其方法返回可序列化对象或接收可序列化参数。 - user107986
1
由于EJB是为分布式应用程序设计的,因此框架本身使这些bean可序列化,以便通过持久化和检索状态来处理bean的激活和去活。 - Ravindra babu
1个回答

13

旧的J2EE风格的EJB实现javax.ejb.EntityBean, javax.ejb.SessionBeanjavax.ejb.MessageDrivenBean需要可序列化的原因是历史性的。这些接口扩展的原始javax.ejb.EnterpriseBean接口恰好自己扩展了java.io.Serializable。在早期的EJB时代,人们认为这是必要的,以便在JVM之间移动bean。

EJB实际上实现Serializable的所有实际理由都在EJB 2.0规范发布时消失了。

EJB 3的引入取消了任何这些接口(以及随后的java.io.Serializable)需要被实现的要求。

自EJB 2.0以来,没有EJB规范指定EJB必须是可序列化的。这只是由于接口继承而隐含地存在。
在EJB 3.x中,隐含的要求完全消失了。

2
顺便提一下,有状态的EJB属性(状态)应该是可序列化的,因为有状态的EJB可以被暂停。 - Mike Argyriou
1
一个实体Bean可以被缓存。它是否也应该实现Serializable接口? - MaxG
2
@MaxG,你是在询问javax.ejb.EntityBeans还是javax.persistence.Entity beans吗?在前者的情况下,一些实现会缓存bean的状态而不是bean本身。在后者现代JPA的情况下,如果它们在将实例在JVM实例之间复制/移动的环境中运行,则期望实体bean实现Serializable。 - Steve C

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接