@ApplicationScoped 必须是可序列化的?

Mar*_*cuX 4 java serialization cdi jakarta-ee

我现在正在学习Java EE 7 教程中的 CDI 范围,并发现在最后一段中它说

使用会话、应用程序或对话范围的 Bean 必须是可序列化的,但使用请求范围的 Bean 不必是可序列化的。

但让我很困惑的是,在我的 IDE(Netbeans 和 IntelliJ Idea)中,当我使用 @SessionScoped 或 @ConversationScoped 时,如果我没有像 Java EE 7 教程中所说的那样实现可序列化,它确实会给我一个错误,显然,我无法构建该项目然后运行它。当我使用 @ApplicationScoped 但没有实现 Serialized 时,事情变得很奇怪,没有错误出现,我可以正常构建然后运行应用程序。

所以我对此很好奇,也很想知道为什么。您能解释一下那里发生了什么吗?太感谢了!

Sil*_*rus 6

IDE 中显示的错误基本上是因为您的 IDE 有一些用于此目的的插件(顺便说一句,这不是 100% 可信的)。

序列化的原因如下:

  • @SessionScoped豆子

    • 这些不仅仅由 CDI 规范处理,其他规范也对它们有要求
    • 即,容器可以选择存储钝化会话以保存资源
    • 另一个故事是服务器之间的复制,因此您的请求可以在多个节点上处理(故障转移场景等)
    • 我们不知道为什么,但正因为如此,我们必须确保这些 bean始终是可序列化的
  • @ConversationScoped豆子

    • 几乎相同的故事,并不是其他规范对它们有要求,而是这些 bean 在会话范围内“存在”,并且可以与会话一样长地存在(如果不早点结束)
    • 由于这些原因,当服务器钝化/复制会话以及会话范围的 Bean 时,它当然也必须钝化/复制会话范围的 Bean
  • @ApplicationScoped豆子

    • 这些确实应该是可序列化的,但在某些情况下,即使它们不是可序列化的,您的应用程序也可以工作
    • 这些情况是您可以避免序列化的情况,例如在单节点应用程序服务器上运行
    • 一旦您需要将此类 bean 复制到多个节点,您也需要它是可序列化的
    • 另一种可以省略可串行性的情况是在 SE 中
    • 因此,您的 IDE 是智能的,并且不强制要求Serializable存在