2016-06-16 9 views
1

なぜjavax.money.CurrencyUnitjava.io.Serializableから延長されていませんか?そのサブタイプのすべてのjava.io.Serializableを実装し、あなたのHibernateマッピングでそれを使用したい場合はその上に、その後、FindBugsのは(かなり正確に)あなたを停止しますので:javax.money.CurrencyUnitがSerializableでないのはなぜですか?

[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 

これは1が使用しなければならないことを意味していますクラスJDKCurrencyAdapterは、ハイバーネイトマッピングですか?私はむしろインターフェイスを使用する方が好きですが、可能でない場合はクラスを使用します。

+0

おそらくCurrencyUnitはインタフェースであり、すでに別のインタフェースを拡張しているため、別のインタフェースを複数拡張することはできません。カスタムクラスでそれらをラップし、Serializableを実装することができます。 – SnakeDoc

+0

特に、「CurrencyUnit」は、すべての実装*がシリアライズ可能である必要があることを明記しているため(シリアル化を提供するプラットフォームで)* https://github.com/JavaMoney/jsr354-api/pullsでこれを聞くことができます – wero

+0

@wero * implementations *はシリアライズ可能でなければなりません。あなたはそれがすべてのサブタイプが実際にはSerializableを拡張(または実装)することをOPが指摘しているので、OPのカスタムクラスもSerializableを実装する必要があります。 – SnakeDoc

答えて

7

Serializableに対する静的検査は、両方向で完全に信頼性がありません。ここでのFindBugsの警告は善意ですが、今のところでCurrencyUnitを使用するのを止めてはいけません。

クラスフィールド

Object aSerializableObject 

を有し、フィールドの静的な型ではないにもかかわらず、シリアライズすることができる - であれば、このフィールドに置か参照がシリアライズ可能であることを確実にするように。したがって、Serializableに対する静的検査は偽陰性を生成します。

また、誤検出も発生します。 Serializableを実装することは、インスタンスが例外なくシリアル化されることを保証するものではありません。これは単なる設計意図の声明です。

ボトムライン:静的タイピング機能として装っているが、シリアル化機能は実際にはダイナミックタイピング機能です。静的チェック(<T extends Serializable>などのコード内か、これらのFindBugs警告などの外部チェック)は、何か問題が発生する可能性のあるヒントにすぎません。

関連する問題