为什么javax.money.CurrencyUnit不能序列化?

时间:2016-06-16 17:43:46

标签: java hibernate java-money jsr354

为什么javax.money.CurrencyUnit不会从java.io.Serializable延伸?它的所有子类都实现java.io.Serializable,最重要的是,如果你想在你的hibernate映射中使用它,那么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

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

1 个答案:

答案 0 :(得分:8)

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

一个类可以有一个字段

Object aSerializableObject

并且可序列化,即使字段的静态类型不是 - 只要它确保放置在此字段中的引用是可序列化的。因此,针对Serializable的静态检查会产生误报。

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

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