java - 将 CDI 对话接口(interface)标记为 transient 是否安全?

标签 java serialization cdi conversation-scope

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

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

FindBugs 提示非 transient 不可序列化实例字段。

最佳答案

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

由于 Conversation 类未实现 Serializable接口(interface)以及静态分析器通常会提示所有字段必须是 Serializable即使该类从未显式序列化或反序列化,也是 transient 的。

首先,你的代码片段有点问题,为什么你要实现这个标记接口(interface)——那么你打算序列化这个类吗?您可能想要添加生成的或默认的串行版本 UID。

要解决此问题,如果您不打算对类进行反/序列化,请将该字段设为transient - 这是无害的,并且不会影响Conversation 的行为。请参阅 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并以同样的方式对待它的字段。

关于java - 将 CDI 对话接口(interface)标记为 transient 是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51379810/

相关文章:

c# - 非序列化无效

java - 为什么具有分离数据源的不同持久化单元查询相同的数据源?

java - 下载和存储图像

android - 包裹中 `createTypedArrayList()`和 `readTypedList()`的区别

java - netbeans 中的默认 glassfish 4.0 密码

json - 如何修复错误类型 'System.Web.Script.Serialization.JavaScriptSerializer' 未定义

jsf - 无法将不可序列化类型的 bean 注入(inject)到钝化范围的 bean 中

jsf - org.jboss.weld.exceptions.WeldException : WELD-000049: Unable to invoke private void init()

java - 代号一 - ScaleImageLabel 中不需要的填充/间距

java - Apache Chemistry 中AllowableActions 的含义