将 CDI 对话接口标记为瞬态是否安全?

Is it safe to mark the CDI conversation interface as transient?

您可以在 @ConversationScoped bean 中注入的对话接口是否安全以标记瞬态(即 CDI 会在序列化期间处理它)还是我需要自定义 read/writeObject?

@ConversationScoped
    public class CDIConversationScopedBean implements Serializable {
        private static final long serialVersionUID = 1L;
        @Inject
        private transient Conversation conversation; // <<-- transient ok?

FindBugs 抱怨非瞬态不可序列化实例字段。

TL;DR: 是的,它很安全。解释:

因为 Conversation class 没有实现 Serializable interface as well the static analyzers usually complain that all the fields must be either Serializable 或瞬态,即使 class 从未明确序列化或反序列化。

首先,你的代码片段有点问题,你为什么要实现这个标记接口 - 所以你打算序列化这个class?您可能想要添加生成的或默认的序列号版本 UID。

要解决此问题,请将字段设为 transient 如果您不打算将 de/serialize 设为 class - 它无害且不会影响 [=10= 的行为].参见 Java 8 规范,chapter 8.3.1.3

Variables may be marked transient to indicate that they are not part of the persistent state of an object.

如果您计划,请Conversation实施Serializable并以同样的方式处理其字段。