Если мы просто говорим о настойчивости, Serializable
не нужен, но лучше всего делать сущности Serializable
.
Если мы выставляем domain
/ entities
объекты, непосредственно представленные на уровне представления, вместо использования DTO
, в этом случае нам нужно реализовать Serializable
. Эти доменные объекты могут храниться в HTTPSession
для целей кэширования / оптимизации. Http-сессия может быть сериализована или сгруппирована. И это также требуется для передачи данных между JVM
-экземплярами.
Когда мы используем DTO
для разделения персистентного слоя и сервисного уровня, пометка доменных объектов как Serializable
будет контрпродуктивной и нарушит «encapsulation
». Тогда это становится анти-паттерном.
Составные идентификаторы
Класс первичного ключа должен быть сериализуемым.
POJO Models
Если экземпляр сущности должен использоваться удаленно как отдельный объект, класс сущностей должен реализовывать интерфейс Serializable
.
Cache
Кроме того, если вы реализуете clustered
второй уровень cache
, тогда ваши сущности должны быть serializable
. Идентификатор должен быть Serializable
, поскольку это требование JPA, поскольку identifier
может использоваться в качестве ключа для записи в кэш второго уровня.
И когда мы сериализуем сущности, обязательно предоставим явный serialVersionUID
с модификатором частного доступа. Потому что если класс serializable
явно не объявляет serialVersionUID
, то среда выполнения сериализации вычислит значение serialVersionUID
по умолчанию для этого класса на основе различных аспектов класса, как описано в Спецификации сериализации объектов Java (TM). Вычисления по умолчанию serialVersionUID
очень чувствительны к деталям класса, которые могут различаться в зависимости от реализаций компилятора, и, следовательно, могут привести к неожиданному InvalidClassExceptions
во время десериализации.