1

为什么不javax.money.CurrencyUnit延伸自java.io.Serializable?它的所有子类型都实现java.io.Serializable了,最重要的是,如果你想在你的休眠映射中使用它,那么 findbugs 会阻止你(非常正确),因为:

[INFO] Class com.mycompany.SiteEntity defines non-transient non-serializable instance field defaultCurrency [com.mycompany.SiteEntity] In SiteEntity.java
[INFO] Class com.mycompany.SiteEntity defines non-transient non-serializable instance field supportedCurrencies [com.mycompany.SiteEntity] In SiteEntity.java
[INFO] Class com.mycompany.UserEntity defines non-transient non-serializable instance field sessionCurrency [com.mycompany.UserEntity] In UserEntity.java

这是否意味着必须JDKCurrencyAdapter在一个人的休眠映射中使用该类?我更喜欢使用接口,但如果不可能,那么我将使用该类。

4

1 回答 1

8

静态检查Serializable在两个方向上都是完全不可靠的。这里的 FindBugs 警告是善意的,但不应阻止您CurrencyUnit像现在这样使用。

一个类可以有一个字段

Object aSerializableObject

并且是可序列化的,即使该字段的静态类型不是 - 只要它确保放置在该字段中的引用是可序列化的。所以静态检查Serializable会产生假阴性。

它还会产生误报;实施Serializable并不能保证实例将毫无例外地序列化;它只是一种设计意图的陈述。

底线:虽然它伪装成静态类型特性,但可串行化实际上是一种动态类型特性。静态检查(无论是在代码内部,例如<T extends Serializable>,还是外部检查,例如这些 FindBugs 警告)只是提示可能出现问题的地方。

于 2016-06-16T18:20:00.523 回答