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

Pet*_*iev 1 java hibernate jsr354 java-money

为什么不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
Run Code Online (Sandbox Code Playgroud)

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

Bri*_*etz 8

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

一个类可以有一个字段

Object aSerializableObject
Run Code Online (Sandbox Code Playgroud)

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

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

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