Какова цель сериализации в Java?

105

Я прочитал немало статей о сериализации и о том, как это красиво и здорово, но ни один из аргументов не был достаточно убедительным. Мне интересно, действительно ли кто-нибудь может сказать мне, чего мы действительно можем достичь, сериализуя класс?

м_а_хан
источник
10
Что «неубедительно» в их аргументах? И почему вы не приняли никаких ответов на свои вопросы?
Аноним.
8
Он «не был уверен», что они ответили на его вопросы.
Энтони Форлони,
5
На самом деле полученные ответы были правильными. Если они не работают для вас, ответьте на них как на комментарии и попытайтесь решить это, вместо того, чтобы просто игнорировать их, а затем начинать обижать других, когда они указывают, что вы неправильно используете ТАК.
Аноним.
4
Anon способствует повышению качества сайта, предотвращая повторяющиеся вопросы. Глупо видеть пять разных вопросов, которые задают одно и то же. Если вы не можете получить ответ, то иногда бывает так. Если вы получили ответ, но он не работает, продолжайте обсуждение в комментариях. ТАК - это не волшебный ящик, который волшебным образом даст вам ответ, если вы просто зададите правильный вопрос, зададите достаточное количество раз или привлеките внимание правильного эксперта.
Крис
1
Либо: (Примите ответ), либо (Оставьте комментарий и / или измените вопрос, объяснив, почему это не то, что вам нужно).
Аноним.

Ответы:

183

Давайте сначала определим сериализацию, а затем поговорим о том, почему она так полезна.

Сериализация - это просто превращение существующего объекта в массив байтов. Этот байтовый массив представляет класс объекта, версию объекта и внутреннее состояние объекта. Затем этот массив байтов можно использовать между JVM, выполняющими один и тот же код, для передачи / чтения объекта.

Зачем нам это нужно?

Причин несколько:

  • Связь: если у вас есть две машины, на которых выполняется один и тот же код, и они должны взаимодействовать, простой способ для одной машины - создать объект с информацией, которую она хотела бы передать, а затем сериализовать этот объект на другой машине. Это не лучший способ общения, но он выполняет свою работу.

  • Постоянство: если вы хотите сохранить состояние определенной операции в базе данных, ее можно легко сериализовать в массив байтов и сохранить в базе данных для последующего извлечения.

  • Глубокая копия: если вам нужна точная копия объекта и вы не хотите тратить время на написание собственного специализированного класса clone (), просто сериализуйте объект в байтовый массив, а затем десериализуйте его в другой объект достигает этой цели.

  • Кэширование: На самом деле это просто приложение из вышеперечисленного, но иногда для создания объекта требуется 10 минут, а для десериализации требуется всего 10 секунд. Таким образом, вместо того, чтобы удерживать гигантский объект в памяти, просто кэшируйте его в файл с помощью сериализации и считайте позже, когда это понадобится.

  • Перекрестная синхронизация JVM: сериализация работает на разных JVM, которые могут работать на разных архитектурах.

Шмельтер
источник
63
Что, черт возьми, построить за 10 минут?
oxbow_lakes
2
Я хочу сказать (конечно), что файловый ввод-вывод, участвующий в сериализации, скорее всего, затмит любые накладные расходы на создание чистого объекта. Я полагаю, вы могли бы говорить о чем-то очень дорогостоящем в вычислительном отношении, например, о научном моделировании, но сериализация - очень плохой механизм для сохранения устойчивости из-за сложности обработки изменений схемы
oxbow_lakes
11
@oxbow_lakes Примером может служить поддержание индекса определенного набора данных для быстрого поиска. Создание такого индекса может занять очень много времени, но как только вы его построите, его можно будет сериализовать / десериализовать относительно быстро.
Дэвид
Если запрос веб-приложения должен пройти через каждый маршрутизатор в мире, прежде чем достичь пункта назначения, построить объект, вернуться обратно с объектом, используя максимально длинный путь, Да, это может занять 10 минут.
Vaibs
@Schmelter, раз уж вы упомянули, что сериализация - не лучший метод для общения, то какой метод лучше всего реализовать?
Ashfaque Rifaye
58

Пока вы запускаете приложение, все его объекты хранятся в памяти (ОЗУ). Когда вы выходите, эта память восстанавливается операционной системой, и ваша программа по сути «забывает» все, что происходило во время работы. Сериализация исправляет это, позволяя вашему приложению сохранять объекты на диск, чтобы оно могло прочитать их при следующем запуске. Если ваше приложение будет предоставлять какой-либо способ сохранения / совместного использования предыдущего состояния, вам понадобится некоторая форма сериализации.

Гордон Густафсон
источник
2
Итак, кажется, что это просто лучший и более эффективный способ записи данных в файл и их считывания при необходимости?
m_a_khan
1
Это единственное НАСТОЯЩЕЕ объяснение. Я не могу придумать другого реального применения сериализации +1
Эмили
Коротко и мило. Прекрасное объяснение.
Яхуб
21

Я могу поделиться своей историей, и я надеюсь, что она даст некоторые идеи, почему сериализация необходима. Однако ответы на ваш вопрос уже очень подробны.

У меня было несколько проектов, которые нужно было загрузить и прочитать кучу текстовых файлов. Файлы содержали стоп-слова, биомедицинские глаголы, биомедицинские аббревиатуры, слова, семантически связанные друг с другом и т. Д. Содержимое этих файлов простое: слова !

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

Итак, что я сделал, так это то, что я создал один объект для чтения каждого из этих файлов и для заполнения отдельных массивов (переменных экземпляра объектов). Затем я сериализовал объекты, а затем для более поздних проектов просто десериализовал их. Мне не приходилось снова и снова читать файлы и заполнять массивы.

Рушди Шамс
источник
1
В таком случае, почему вам нужно хранить их в потоке байтового массива (используя сериализацию), может ли это быть проще, чем просто использовать временное поле?
kidnan1991
3

В сущности :

Сериализация - это процесс преобразования набора экземпляров объектов, содержащих ссылки друг на друга, в линейный поток байтов, который затем может быть отправлен через сокет, сохранен в файл или просто обработан как поток данных.

См. Использование из Wiki :

Сериализация имеет ряд преимуществ. Это обеспечивает:

  1. метод сохранения объектов, который более удобен, чем запись их свойств в текстовый файл на диске, и их повторная сборка путем чтения этого обратно.
  2. метод выдачи удаленных вызовов процедур, например, как в SOAP
  3. метод распределения объектов, особенно в программных компонентах, таких как COM, CORBA и т. д.
  4. метод обнаружения изменений в изменяющихся во времени данных.
Бассейн
источник
1

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

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

ddyer
источник
0

Сериализованные объекты сохраняют состояние в пространстве, они могут передаваться по сети, файловой системе и т. Д., И со временем они могут пережить JVM, которая их создала.

Иногда это бывает полезно.

Давид Сороко
источник
Это может быть достигнуто с помощью простого файла, содержащего также некоторый текст. Чтение сериализованного объекта немного проще, чем чтение состояния объекта, записанного в текстовый файл, верно?
m_a_khan
@m_a_khan: Вау. Да, это можно сделать с помощью простого текста. Но как только объекты станут более сложными или их структуры (составление, наследование) станут более сложными, их вручную (де) упорядочить станет сложно. Представьте, что у вас есть списки, наборы и карты как члены объекта.
Дирк Шумахер
Легко придумать разные схемы сериализации, и их действительно много. По очень веским причинам ни один из них не приводит к общему случаю, к «простому тексту»,
Дэвид Сороко
0

Я использую сериализованные объекты для стандартизации аргументов, которые я передаю функциям или конструкторам классов. Передача одного сериализованного компонента намного чище, чем длинный список аргументов. В результате код становится легче читать и отлаживать.

Рон Норман
источник
1
На мой взгляд, поиск и использование одного объекта конфигурации в качестве параметра довольно ортогональны. Вероятно, это не типичный вариант использования.
Gábor Bakos
0

Для простой цели обучения (обратите внимание, я сказал обучение, я не сказал лучше или даже хорошо, но просто ради понимания материала), вы можете сохранить свои данные в текстовый файл на компьютере, а затем иметь программу который читает эту информацию, и на основе файла вы можете настроить свою программу по-другому. Если бы вы были более продвинутыми, это был бы не обязательно текстовый файл, а что-то еще.

С другой стороны, сериализация переводит вещи прямо на компьютерный язык. Это похоже на то, что вы говорите испанскому компьютеру что-то по-испански, а не говорите ему что-то по-французски, заставляя его изучать французский, а затем сохраняете вещи на его родном испанском языке, переводя все. Не самый технологичный ответ, я просто пытаюсь создать понятный пример в общеязыковом формате.

Сериализация также выполняется быстрее, поскольку в Java объекты обрабатываются в куче и занимают намного больше времени, чем если бы они были представлены в виде примитивов в стеке. Скорость, скорость, скорость. И меньше обработки файлов с точки зрения программиста.

JCoder
источник
Пытаясь изложить все на простом английском языке, вы на самом деле не объяснили сериализацию каким-либо полезным образом.
user3516726