Java-сериализация (и, в частности, Serializable и Exernalizable интерфейсы) позволяет читать / записывать произвольно сложные объекты Java, автоматически или вручную с / на диск или с / на сеть. В то время как XML и JSON являются текстовыми форматами, Java-сериализация является двоичным форматом. (Сериализация также является общей концепцией простого чтения / записи данных, но поскольку вопрос касается Java, я предполагаю, что вы имеете в виду встроенную систему сериализации, т.е. Serializable / Exernalizable)
Преимущества "реализует Сериализуемый" перед XML / JSON
Сначала вы получаете сериализацию практически бесплатно. Вам не нужно вносить очень много изменений в свои объекты, чтобы механизм сериализации работал с ним. Другое преимущество состоит в том, что, поскольку это двоичный формат, он намного более компактен, чем текстовый формат, и поэтому, вероятно, будет использовать меньше места (что хорошо для сохранения пропускной способности сети или для сохранения места на диске).
Недостатки "реализует Сериализуемый" перед XML / JSON
Недостаток встроенной сериализации Java заключается в том, что если вы вносите изменения в свой объект, совместимость различных форматов сериализации может стать настоящим кошмаром. Кроме того, в то время как вы можете вручную редактировать XML и JSON, вы не можете редактировать сериализованный объект Java (без чтения его в Java). По тем же причинам зачастую проще отлаживать XML и JSON, чем двоичные форматы, поскольку XML и JSON удобочитаемы для человека. Еще один недостаток встроенного механизма Java-сериализации в том, что вы не можете (легко) сериализовать / десериализовать данные из другого языка программирования.
Альтернативные методы чтения / записи данных
Существуют альтернативные методы сериализации, отличные от встроенной сериализации Java, которые дают вам лучшее из обоих миров: компактные двоичные форматы, взаимодействие языков, простота совместимости версий, а также часто инструменты отладки, которые облегчают вывод двоичных данных в читаемый формат. Например, буферы протокола с открытым исходным кодом Google и MessagePack представляют собой примеры библиотек / форматов сериализации, которые позволяют вам читать / записывать компактные двоичные данные и легко поддерживать совместимость версий. Самым большим недостатком этих библиотек по сравнению со встроенной сериализацией Java является то, что они включают в себя простые объекты старых данных для сериализации (в отличие от более полнофункциональных объектов Java, с которыми также связано поведение); однако этот недостаток, по сути, является преимуществом, поскольку отделение модели данных, в которой / из которой хранится информация, от объектов, которые обертывают или получают из них, на самом деле является хорошей практикой программирования и облегчает поддержку нескольких форматов.
Использование
Поскольку вы спрашивали о необходимости, а не просто об определении, существует несколько вариантов использования:
Просто сохраните ваши данные для последующего использования. Например, допустим, вы пишете видеоигру. Ваша программа не будет работать вечно; даже если он никогда не выйдет из строя (что, как мы надеемся), в какой-то момент ваш пользователь, вероятно, выйдет из программы, или операционная система может убить программу, чтобы сэкономить ресурсы (например, в Android, часто происходят фоновые процессы, с которыми пользователь не взаимодействует). и намеренно убит ОС для восстановления системных ресурсов, таких как ОЗУ). Чтобы гарантировать, что пользователь не запускается с самого начала и может вместо этого возобновить с того места, где он находился, или с самой последней точки сохранения, вы захотите записать состояние игры в постоянное хранилище (то есть на жесткий диск, учетная запись пользователя Google Drive и т. д.). Для этого вам необходимо преобразовать структуры данных в памяти, которые представляют состояние игры, в необработанные байты, которые вы можете записать на диск (или в любую систему, в которой вы сохраняете данные).
Получение информации с удаленного сервера.Давайте продолжим с примером игры ... предположим, что вы создаете многопользовательскую онлайн-игру или хотите, чтобы в игре можно было добавлять новые уровни или предметы без обновления пользователем своего приложения.Для этого вы хотите, чтобы информация об онлайн-плеере или информация о новых уровнях / элементах передавалась с серверного компьютера (который вы используете в качестве точки контакта для всех копий приложения, установленных на различных устройствах)к отдельным копиям приложения.Как серверу, так и приложению требуется своего рода представление этих структур данных в памяти (например, местоположение других игроков, структура нового уровня, описание / изображение для нового элемента и т. Д.), Но для передачи информацииот сервера до приложения на устройстве, система связи состоит из необработанных байтов, поэтому необходимо иметь способ преобразования данных в необработанные байты и из необработанных байтов обратно в значимую структуру данных в памяти.
Практически любой обмен данными между двумя различными процессами / приложениями или между приложением и некоторой системой хранения - это случай, когда требуется какой-то механизм сериализации.