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