【问题标题】:Is it safe to mark the CDI conversation interface as transient?将 CDI 对话界面标记为瞬态是否安全?
【发布时间】:2018-12-25 01:30:39
【问题描述】:

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

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

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

【问题讨论】:

    标签: java serialization cdi conversation-scope


    【解决方案1】:

    TL;DR:是的,它是安全的。说明:

    由于Conversation 类也没有实现Serializable 接口,静态分析器通常抱怨所有字段必须是Serializable 或瞬态,即使该类从未显式序列化或反序列化。

    首先,你的sn-p有点问题,你为什么要实现这个标记接口——那么你打算序列化这个类吗?您可能想要添加生成的或默认的序列版本 UID。

    要解决这个问题,如果您不打算对类进行反序列化/序列化,请创建字段transient - 它是无害的,不会影响Conversation 的行为。请参阅 Java 8 规范,chapter 8.3.1.3

    变量可能被标记为瞬态,以表明它们不是对象持久状态的一部分。

    如果您计划,让Conversation 实现Serializable 并以相同方式处理其字段。

    【讨论】:

    • 会话接口是CDI提供的接口,我怎样才能让它按照你的建议实现Serializable?
    • 你不能序列化一个没有实现Serializable接口的类,但是你可以把它包装在一个实现的类中——使用装饰器。再说一遍:你需要序列化它吗?如果没有,请将字段设为transient。那你为什么要实现Serializable呢?真正的问题在这里:序列化还是不序列化。
    • 实现了 Serializable 标记,因为 CDI 规范要求像 @ConversationScoped 这样的钝化 bean 实现它。
    • 嗯,这意味着你不序列化类,然后使用 transient 关键字,FindBugs 停止抱怨。请参阅我的回答,它解释了为什么“瞬态可以吗?”。
    • 链接问题的答案之一以:“不仅在将对象持久化到硬盘时尝试序列化,而且在转移到分布式环境中的另一个节点时尝试序列化。” - 没有您的意图,序列化不会开始。问题又来了:你打算序列化还是不序列化?
    猜你喜欢
    • 2012-08-24
    • 1970-01-01
    • 1970-01-01
    • 2018-08-06
    • 1970-01-01
    • 2018-09-08
    • 2019-04-01
    • 1970-01-01
    • 2012-04-07
    相关资源
    最近更新 更多