您可以在@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/