Почему javax.money.CurrencyUnit не сериализуем?

Почему 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 в своем спящем отображении? Я бы предпочел использовать интерфейс, но если это невозможно, я буду использовать класс.

1 ответ

Решение

Статические проверки против Serializable абсолютно ненадежны в обоих направлениях. Предупреждения FindBugs здесь благими намерениями, но не должны мешать вам использовать CurrencyUnit как ты сейчас.

У класса может быть поле

Object aSerializableObject

и быть сериализуемым, даже если статический тип поля - нет - при условии, что ссылки, размещенные в этом поле, являются сериализуемыми. Так что статическая проверка против Serializable производит ложные негативы.

Это также производит ложные срабатывания; реализации Serializable не является гарантией того, что экземпляры будут сериализованы без исключения; это просто заявление о намерении проекта.

Итог: несмотря на то, что он маскируется как функция статической типизации, в действительности сериализуемость является функцией динамической типизации. Статические проверки (будь то внутри кода, такие как <T extends Serializable>или внешние проверки, такие как эти предупреждения FindBugs) - это просто подсказки о том, где что-то может пойти не так.

Другие вопросы по тегам