我还没有遇到任何与序列化相关的问题。但 PMD 和 Findbugs 检测到一系列有关序列化的潜在问题。一个典型的情况是注入的记录器被检测为不可序列化。但还有更多——EntityManager
和一些 CDI 豆。
我还没有找到任何关于如何正确处理序列化的最佳实践。
- 将字段注入
@Inject
and @PersistenceContext
反序列化时重新注入?
- 他们应该被标记为
transient
?
- 或者我应该忽略/关闭代码检查?
- 我真的应该像 PMD 建议的那样提供所有这些字段的访问器吗?
我意识到这是一个老问题,但我相信提供的唯一答案是不正确的。
由 @Inject 和 @PersistenceContext 注入的字段将是
反序列化时重新注入?
不,他们不会。我在集群环境中使用 JBoss 时亲身经历过这一点。如果 bean 具有钝化能力,则容器必须注入可序列化代理。该代理被序列化和反序列化。反序列化后,它将找到正确的注入并重新连接它。但是,如果将字段标记为“transient”,则代理不会序列化,并且在访问注入的资源时您将看到 NPE。
应该注意的是,注入的资源或 bean 不必是可序列化的,因为代理将是可序列化的。唯一的例外是 @Dependent 作用域 bean,它必须是可序列化的或注入瞬态的。这是因为在这种情况下没有使用代理。
它们应该被标记为瞬态吗?
不,请参阅上文。
或者我应该忽略/关闭代码检查?
这取决于你,但这就是我会做的。
我真的应该像 PMD 建议的那样提供所有这些字段的访问器吗?
我不会。
在我们的项目中,当我们知道我们正在使用 CDI 时,我们会禁用此检查。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)