Алгоритм сериализации объектов в Java

Сериализацией (Serialization) называют процесс сохранения состояния объекта в последовательность байт, в то время как десериализацией называют обратный процесс, формирующий объект из последовательности байт. Java Serialization API предоставляет разработчикам механизм, позволяющий производить сериализацию/десериализацию объектов. В этой статье вы узнаете, как сериализовать объект, и когда сериализация является необходимой. Вы так же узнаете, как работает алгоритм сериализации в Java на примере, иллюстрирующем формат сериализации объектов на низком уровне.

Итак, зачем нужна сериализация?

На сегодняшний день, традиционное приложение уровня предприятия состоит из разнообразных компонентов и распределено между различными системами и сетями. В Java всё представлено в качестве объектов (за исключением примитивных типов); для того, чтобы два объекта могли взаимодействовать между собой, должен существовать механизм, позволяющий обмениваться данными. Одним из путей достижения такого взаимодействия может служить разработка протокола обмена объектами. В этом случае получатель объекта должен работать по такому же протоколу, по которому работает отправитель объекта, что в свою очередь может привести к затруднениям при интеграции ваших компонентов со сторонними компонентами. Из этого следует, что протокол должен быть простым и обобщённым, что в свою очередь в Java достигается с помощью сериализации. (more…)

Какими должны быть EntityBean’ы?

Вот уже в который раз мне пришлось исправлять ранее написанные сущностные бины (в моем случае это OpenJPA) таким образом, что бы они соответствовали следующим требованиям:

  1. Каждый класс должен быть объявлен с модификатором public
  2. Каждый класс должен реализовывать интерфейс Serializable
  3. Каждый класс должен иметь публичный конструктор без аргументов
  4. Если класс является внутренним, он должен быть статическим
  5. Метод equals должен быть реализован таким образом, чтобы он обеспечивал уникальность сущности в соответствии с теми полями, которые непосредственно обеспечивают уникальность в таблице. (more…)

ORM и подводные камни реализации equals и hashCode.

Думаю каждому, кому приходилось работать в плотную с ORM (аля Hibernate, TopLink, OpenJPA, …), приходилось сталкиваться с подводными камнями при реализации классов. Тоже самое случилось и со мной, когда мне поручили искать бажину в одном из наших приложений …. окна дебага поглотили меня не на один час… Проблема заключалась в том, что при вызове утильного метода ListUtils.subtract(list1, list2) (данный метод исключает list2 из list1) на выходе получалось совсем не то что ожидалось, а получалось так потому, что лажа скрывалась в реализации метода equals. Просто не нужно в equals обрабатыать ВСЕ поля класса, ну не нужно, я Вас умоляю. В моём случае в equals обрабатывалось поле lastUpdated – о чём это говорит, думаю Вы догадываетесь. Именно по этой причине некоторые классы входящие в список list2 не исключались из списка классов list1, которые были детачены ранее. Плюс ко всему, старайтесь реализовывать метод equals таким образом, что бы он обеспечивал УНИКАЛЬНОСТЬ сущности в соответствии с теми полями, которые непосредственно обеспечивают уникальность в таблице! (more…)