将 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
并以同样的方式处理其字段。
您可以在 @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
并以同样的方式处理其字段。