Какова цель сериализации в Java?
Я прочитал довольно много статей о сериализации и о том, как она хороша и великолепна, но ни один из аргументов не был достаточно убедительным. Мне интересно, может ли кто-нибудь действительно сказать мне, чего мы можем добиться, сериализовав класс?
9 ответов
Давайте сначала определим сериализацию, а затем поговорим о том, почему она так полезна.
Сериализация - это просто превращение существующего объекта в байтовый массив. Этот байтовый массив представляет класс объекта, версию объекта и внутреннее состояние объекта. Этот байтовый массив может затем использоваться между JVM, выполняющими один и тот же код для передачи / чтения объекта.
Зачем нам это делать?
Есть несколько причин:
Обмен данными: если у вас есть две машины, на которых выполняется один и тот же код, и им нужно обмениваться данными, простой способ состоит в том, чтобы на одной машине был создан объект с информацией, которую он хотел бы передать, а затем сериализовал бы этот объект на другой машине. Это не лучший способ общения, но он выполняет свою работу.
Постоянство: если вы хотите сохранить состояние конкретной операции в базе данных, ее можно легко сериализовать в байтовый массив и сохранить в базе данных для последующего извлечения.
Deep Copy: если вам нужна точная копия объекта и вы не хотите писать собственный специализированный класс clone(), просто сериализовать объект в байтовый массив, а затем десериализовать его в другой объект достигает этой цели.
Кэширование: на самом деле это просто приложение, описанное выше, но иногда создание объекта занимает 10 минут, а десериализация - всего 10 секунд. Таким образом, вместо того, чтобы удерживать гигантский объект в памяти, просто кэшируйте его в файл с помощью сериализации и читайте его позже, когда это необходимо.
Перекрестная синхронизация JVM: Сериализация работает на разных JVM, которые могут работать на разных архитектурах.
Пока вы запускаете ваше приложение, все его объекты хранятся в памяти (RAM). Когда вы выходите, эта память восстанавливается операционной системой, и ваша программа по существу "забывает" обо всем, что происходило во время работы. Сериализация исправляет это, позволяя вашему приложению сохранять объекты на диск, чтобы оно могло прочитать их при следующем запуске. Если ваше приложение предоставляет какой-либо способ сохранения / публикации предыдущего состояния, вам потребуется некоторая форма сериализации.
Я могу поделиться своей историей, и я надеюсь, что она даст некоторые идеи, почему сериализация необходима. Тем не менее, ответы на ваш вопрос уже удивительно подробно.
У меня было несколько проектов, которые нужно загрузить и прочитать несколько текстовых файлов. Файлы содержали стоп-слова, биомедицинские глаголы, биомедицинские сокращения, слова, семантически связанные друг с другом и т. Д. Содержимое этих файлов простое: слова!
Теперь для каждого проекта мне нужно было прочитать слова из каждого из этих файлов и поместить их в разные массивы; так как содержимое файла никогда не менялось, оно стало обычной, но излишней задачей после первого проекта.
Итак, я создал один объект для чтения каждого из этих файлов и для заполнения отдельных массивов (переменных экземпляров объектов). Затем я сериализовал объекты и затем для последующих проектов я просто десериализовал их. Мне не нужно было читать файлы и заполнять массивы снова и снова.
Сериализация - это процесс преобразования набора экземпляров объектов, содержащих ссылки друг на друга, в линейный поток байтов, который затем может быть отправлен через сокет, сохранен в файл или просто обработан как поток данных.
Смотрите использование из вики:
Сериализация имеет ряд преимуществ. Это обеспечивает:
- метод сохранения объектов, который более удобен, чем запись их свойств в текстовый файл на диске, и повторная сборка их путем чтения этого в.
- метод выдачи удаленных вызовов процедур, например, как в SOAP
- метод для распределения объектов, особенно в программных компонентах, таких как COM, CORBA и т. д.
- метод обнаружения изменений в изменяющихся во времени данных.
Наиболее очевидным является то, что вы можете передавать сериализованный класс по сети, а получатель может создать копию исходного экземпляра. Кроме того, вы можете сохранить сериализованную структуру в файловую систему.
Также обратите внимание, что сериализация является рекурсивной, поэтому вы можете при желании сериализовать всю гетерогенную структуру данных за один цикл.
Я использую сериализованные объекты для стандартизации аргументов, которые я передаю функциям или конструкторам классов. Передача одного сериализованного компонента намного чище, чем длинный список аргументов. В результате получается код, который легче читать и отлаживать.
Одним из классических примеров использования сериализации в повседневной жизни является опция «Сохранить игру» в любой компьютерной игре. Когда игрок решает сохранить свой прогресс в игре, приложение записывает сохраненное состояние игры в файл посредством сериализации, и когда игрок «Загрузить игру», считывается сериализованный файл, и состояние игры создается заново.
Для простой цели обучения (обратите внимание, я сказал, что учусь, я не сказал, лучше или даже хорошо, но просто для понимания вещей), вы можете сохранить свои данные в текстовом файле на компьютере, а затем иметь программу который читает эту информацию, и, основываясь на файле, ваша программа может реагировать по-другому. Если бы вы были более продвинутыми, это не обязательно должен быть текстовый файл, а что-то еще.
Сериализация, с другой стороны, помещает вещи непосредственно в компьютерный язык. Как будто вы говорите испанскому компьютеру что-то по-испански, а не говорите по-французски, заставляете учить французский, а затем сохраняете вещи на родном испанском языке, переводя все. Не самый технологичный ответ, я просто пытаюсь создать понятный пример в формате общего языка.
Сериализация также быстрее, потому что в Java объекты обрабатываются в куче и занимают намного больше времени, чем если бы они были представлены в стеке как примитивы. Скорость, скорость, скорость. И меньше обработки файлов с точки зрения программиста.
Сериализованные объекты поддерживают состояние в пространстве, их можно передавать по сети, файловой системе и т. Д., А время они могут пережить созданную ими JVM.
Иногда это полезно.