为什么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
?我更喜欢使用界面,但如果不可能,那么我将使用该类。
答案 0 :(得分:8)
针对Serializable
的静态检查在两个方向上完全不可靠。这里的FindBugs警告是善意的,但不应该阻止你像现在一样使用CurrencyUnit
。
一个类可以有一个字段
Object aSerializableObject
并且可序列化,即使字段的静态类型不是 - 只要它确保放置在此字段中的引用是可序列化的。因此,针对Serializable
的静态检查会产生误报。
它也会产生误报;实现Serializable
并不能保证实例会毫无例外地序列化;它只是一个设计意图的陈述。
底线:虽然它伪装成静态输入功能,但可串行化实际上是一种动态输入功能。静态检查(无论是在代码中,如<T extends Serializable>
,还是外部检查,例如这些FindBugs警告),只是提示某些内容可能出错的地方。