您可以在 @ConversationScoped Bean 中注入的对话接口是否可以安全地标记瞬态(即 CDI 是否会在序列化期间处理它),或者我是否需要自定义读/写对象?
@ConversationScoped
public class CDIConversationScopedBean implements Serializable {
private static final long serialVersionUID = 1L;
@Inject
private transient Conversation conversation; // <<-- transient ok?
FindBugs抱怨一个非暂时的不可序列化实例字段。
TL;大卫:是的,它是安全的。解释:
由于 Conversation
类也不实现可序列化接口,因此静态分析器通常会抱怨所有字段都必须是可
序列化的或暂时的,即使该类从未显式序列化或反序列化
也是如此。
首先,你的代码片段有点问题,你为什么要实现这个标记接口——那么你打算序列化这个类吗?您可能希望添加生成的或默认的串行版本UID。
为了解决这个问题,如果您不打算对类进行反序列化/序列化,请将字段<code>设为瞬态</code>-这是无害的,并且不会影响<code>会话</code>的行为。参见Java 8规范,第8.3.1.3章。
变量可能被标记为瞬态,以指示它们不是对象持久状态的一部分。
如果您计划,请使Conversation
实现可序列化
并以相同的方式处理其字段。
问题内容: 选项: A.因为Foo实现了Serializable,所以可以序列化Foo的实例。 B. Foo的实例无法序列化,因为Foo包含不可序列化的实例变量v3。 C.如果将v3标记为瞬态,则Foo的实例是可序列化的。 D.b和c 答案:D 说明:即使对象的类实现了,也可能无法序列化,因为它可能包含不可序列化的实例变量。 现在我的问题是: 据我所知,transient 用于关闭序列化。那么在这
问题内容: 有人可以解释一下Java中标记接口的约定吗? 例如:如果标记界面没有字段/方法,那么定义在哪里? 为什么每次使用时都应实施i / f ? 好吧,我的问题是,如果是类方法,为什么要实现i / f来覆盖。 有人可以详细说明一下Java的这种约定吗? 提前致谢 问题答案: 在所有类的扩展类中定义,但它是。这实际上是一个具体的方法实现,它对对象进行逐字段克隆,但前提是您已实现接口以表明允许这样
有人可以解释一下 java 中标记接口的契约吗? 例如:如果是一个没有字段/方法的标记接口,那么在哪里定义? 为什么每当使用 时,我们都应该实现的 i/f? 好吧,我的问题是,如果是 class的一种方法,为什么要实现 i / f来覆盖 有人能详细说明一下java的这个惯例吗? 提前致谢
问题内容: 在阅读有关标记接口的信息时,我偶然发现了以下站点:项目37:使用标记接口定义类型 在这里,根据Joshua Bloch的说法,标记接口比标记注释有两个优点。 1. 标记接口定义了一种由标记的类的实例实现的类型。标记注释没有。这种类型的存在使您可以在编译时捕获错误,而如果使用标记注释,则这些错误在运行时才捕获。 2. 标记接口相对于标记注释的另一个优点是可以更精确地定位它们。如果使用ta
在阅读有关标记接口的内容时,我偶然发现了以下网站:第37项:使用标记接口定义类型 根据Joshua Bloch的说法,标记接口比标记注释有两个优点。 > 标记接口定义由标记类的实例实现的类型;标记注释没有。这种类型的存在允许您在编译时捕获错误,如果您使用标记注释,则直到运行时才能捕获这些错误。 与标记注释相比,标记接口的另一个优点是可以更精确地定位它们。如果使用target,它可以应用于任何类或接
我有一个包含以下代码的类: 这使我可以迭代该接口的所有实现。现在,我想测试这个,所以我声明了这些接口的一些,并想注入到我的测试单元中。但这失败了。 是否可以很好地完成类似的操作,或者我必须为