java — Сериализация простыми словами
Много раз встречал эту «сериализацию» на разных ресурсах, часто связано с JSON.
Объясните, пожалуйста, простыми словами, что такое сериализация, где и зачем ее применяют ?
- java
- android
- serialize
0
Сериализация — это преобразование объекта или дерева объектов в какой-либо формат с тем, чтобы потом эти объекты можно было восстановить из этого формата. Используется, например, для сохранения состояния программы (то есть, некоторых её объектов) между запусками. Или для передачи данных между различными экземплярами программы (или различными программами), например, по сети.
Главная идея состоит в том, что сериализованный формат — набор байт или строка, которую можно легко сохранить на диск или передать другому процессу или, например, по сети, в отличие от самого объекта. А значит, задача сохранения объекта/группы объектов при этом сводится к простой задаче сохранения набора байт или строки.
JSON — один из популярных форматов для сериализации, он текстовый, легковесный и легко читается человеком.
Пример: если у вас есть класс
class Test { int length; String name; public Test(int length, String name) { this.length = length; this.name = name; } }
Объект этого класса в сериализованной форме может иметь вид
{ "length": 25, "name": "Имя" }
Саму сериализацию (и десериализацию) можно производить вручную, или пользоваться соответствующими библиотеками/фреймворками.
Существуют и бинарные форматы сериализации.
17
Сериализация в общем виде — это процесс сохранения объекта в виде последовательности байт, чтобы в будущем по этой последовательности можно было бы восстановить исходный объект. В частном случае — это может быть сохранение в текстовую строку, хотя это далеко не обязательно.
Если объект сериализуется в текстовую строку, то тут могут быть разные форматы, включая XML и упомянутый в вопросе JSON. Последний для этой цели наиболее популярен в последнее время, т.к. JSON — это и так представление объекта в том формате, как объект создается в JavaScript. Собственно, JSON и переводится как JavaScript Object Notation.
Сериализацию можно использовать для хранения объектов на диске, для передачи его по сети или для передачи объекта другому процессу.
Процесс, обратный сериализации, называется десереализация. В случае, если другой процесс получает строку JSON, то он должен десереализовать строку в объект.
1
Если на кошках Вы пишете эмулятор кота — тамагочи. У вас есть объект класс cat
class Cat { private int age; private int weight; // other cat logic }
Вы хотите, чтобы при следующем запуске приложения этот же кот продолжал жить своей жизнью, а не пересоздался заново. Для этого вы реализуете сериализацию\десериализацию кота — то есть созранение\загрузку. Как — так как вам удобно. Можно сделать его Serializable и хранить в бинарном виде, можно сохранять в текстовый файл как JSON (JavaScript Object Notation), можно в базе хранить. Главное — вы сохраняете каким-то образом его состояние (в данном случае — поля), и потом, когда вам это будет нужно, их загружаете. Так же сериализованного кота можно будет например передать по сети на сервер. То есть вы передаете его состояние, а сервер у себя создаст новый объект класса Cat и установит у него это состояние (age и weight).
1
Сериализация используется для хранения сущностей в виде строки. Например можно взять объект, сериализовать и записать в базу данных.
Json — формат представления данных. Он может представлять объекты или массивы. Эти сущности также можно сериализовать. Если вывести сериализованый объект в Json, то можно получить строку сериализованного объекта.
0
Сериализация — это преобразование данных. Если из более «понятного» в менее — это сериализация. А наоборот — десериализация.
Десериализовывать данные нужно, например, чтобы придать им человеко-читаемы вид, или такой формат, который можно и\или удобно использовать в работе приложение.
Сериализовать данные нужно, например, для хранения или пересылки. Потому что — есть определённый формат хранения\пересылки данных и данные нужно в него преобразовать.
Очень часто речь идёт о преобразовании в JSON — для отправки на сервер — это сериализация. И обратно — для использования в приложении — это десериализация.
Например — в интерфейсе приложения данные должны быть представлены в виде таблицы — и их нужно правильно достать из JSON и напихать в ячейки. Потом эти данные изменит пользователь и их нужно будет преобразовать обратно в дерево JSON, чтобы отправить на сервер.
Вот и всё… А вот это вот «процесс перевода структуры данных в последовательность байтов» — видимо сухая формулировка из старого учебника, которая мало способствует пониманию.
1
Зарегистрируйтесь или войдите
Регистрация через GoogleРегистрация через Facebook
Регистрация через почту
Отправить без регистрации
Почта
Необходима, но никому не показывается
Отправить без регистрации
Почта
Необходима, но никому не показывается
Нажимая на кнопку «Отправить ответ», вы соглашаетесь с нашими пользовательским соглашением, политикой конфиденциальности и политикой о куки
Сериализация .
Графические интерфейсы пользователя JavaОднако все эти объекты существуют лишь до тех пор, пока выполняется создавшая их виртуальная машина.
Было бы неплохо, если бы создаваемые нами объекты могли бы существовать и вне пределов жизненного цикла виртуальной машины?
Как уже было сказано, JavaBeans обладает свойством сохранения, когда его свойства, поля и информация о состоянии могут сохраняться и извлекаться из хранилища.
Механизм, который делает возможным такое сохранение, называется сериализацией.
Сериализация объектов означает преобразование объекта в поток данных и запись его в хранилище, при этом объект представлен как последовательность байтов, которая включает в себя данные объекта, а также информацию о типе объекта и типах данных, хранящихся в объекте.
Любое приложение, которое использует такой компонент, может затем «восстановить» его путем десериализации.
Затем объект возвращается в исходное состояние.
Например, приложение Java может сериализовать окно Frame на машине Windows, сериализованный файл можно отправить с помощью электронной почты на машину Solaris, а затем приложение Java сможет восстановить окно Frame в точное состояние, существующее на машине Windows.
Чтобы так сохраняться, компоненты должны поддерживать сериализацию, реализуя либо интерфейс java.io.Serializable, либо интерфейс java.io.Externalizable.
При сериализации объекта в файл, по соглашению создается файл с расширением. ser.
Классы ObjectInputStream и ObjectOutputStream представляют собой потоки, которые содержат методы сериализации и десериализации объекта.
Это два класса, с помощью которых собственно осуществляют сериализацию и десериализацию объекта.
Если какой-либо класс в иерархии наследования класса реализует интерфейс Serializable или Externalizable, тогда этот класс и его подклассы сериализуются.
Примеры сериализуемых классов включают в себя классы Component, String, Date, Vector и Hashtable.
Известные классы, которые не поддерживающие сериализацию, включают в себя классы Image, Thread, Socket и InputStream.
Попытка сериализации объектов этих типов приведет к исключению NotSerializableException.
Java Object Serialization API автоматически сериализует большинство полей объекта Serializable в поток байтов.
Сюда входят примитивные типы, массивы и строки.
API не сериализует или десериализует поля, отмеченные как transient или static.
Transient (нерезидент) – модификатор полей класса.
Отмеченные этим модификатором поля не записываются в поток байт при применении стандартного алгоритма сериализации.
При десериализации объекта такие поля инициализируются значением по умолчанию.
Этот модификатор применяется, например, если поле класса является объектом несериализуемого класса, или некоторые поля могут не сериализоваться из соображений безопасности, например, поле пароля, или значение поля корректно только в рамках текущего контекста.
Вы можете контролировать уровень сериализации объекта.
Есть несколько способов управления серилизацией:
Это автоматическая сериализация, реализуемая интерфейсом Serializable.
Программное обеспечение сериализации Java сериализует весь объект, за исключением полей transient или static.
Интерфейс Serializable не объявляет никаких методов; он действует как маркер, сообщая инструментам сериализации объектов, что ваш класс сериализуется.
Маркировка класса интерфейсом Serializable означает, что вы сообщаете виртуальной машине Java (JVM), что ваш класс будет работать с сериализацией по умолчанию.
Классы, которые реализуют Serializable, должны иметь доступ к конструктору без аргументов супертипа.
Этот конструктор будет вызываться, когда объект будет «восстанавливаться» из файла. ser, в котором хранится сериализованный объект.
Вам не нужно реализовывать Serializable в вашем классе, если он уже реализован в суперклассе.
Все поля, кроме полей transient или static, сериализуются.
Используйте модификатор transient, чтобы указать поля, которые вы не хотите сериализовать, и указать классы, которые не являются сериализуемыми.
Если объект однажды уже записанный в поток, спустя какое-то время записывается в него снова, то по умолчанию, ObjectOutputStream сохраняет ссылки на объекты, которые в него записываются.
Это означает, что, если состояние записываемого объекта, который уже был записан, будет записано снова, новое состояние не сохраняется.
Существует два способа это исправить.
Во-первых, вы можете каждый раз после вызова метода записи закрывать поток, а затем открывать его снова.
Во-вторых, вы можете вызвать метод ObjectOutputStream.reset, который сигнализирует потоку о том, что необходимо освободить кэш от ссылок, которые он хранит, чтобы новые вызовы методов записи действительно записывали данные.
Вы можете дополнительно контролировать, как объекты сериализуются, путем написания собственных реализаций методов writeObject и readObject и включить их в свой сериализуемый класс.
Классы, требующие специальной обработки во время процесса сериализации и десериализации, должны определить эти методы с этими точными сигнатурами.
Метод writeObject класса определяет сериализацию объекта.
А метод readObject восстанавливает поток данных, который вы определили с помощью writeObject.
Если же вы хотите полностью контролировать сериализацию объекта, используйте интерфейс Externalizable, например, при записи и чтении определенного формата файла.
Для использования интерфейса Externalizable вам необходимо реализовать два метода: readExternal и writeExternal.
Классы, которые реализуют Externalizable, должны иметь конструктор без аргументов.
Класс XMLEncoder позволяет сериализовать объект в XML-файл.
Одно из достоинств этой формы сериализации заключается в том, что вы можете легко просмотреть данные объекта в сохраненной форме.
Вы также можете изменить данные в файле в текстовом редакторе.
Соответственно с помощью класса XMLEncoder, можно легко восстановить потом объект из XML-файла.
Данный текст является ознакомительным фрагментом.
404: Страница не найдена
Страница, которую вы пытались открыть по этому адресу, похоже, не существует. Обычно это результат плохой или устаревшей ссылки. Мы извиняемся за любые неудобства.
Что я могу сделать сейчас?
Если вы впервые посещаете TechTarget, добро пожаловать! Извините за обстоятельства, при которых мы встречаемся. Вот куда вы можете пойти отсюда:
Поиск- Узнайте последние новости.
- Наша домашняя страница содержит самую свежую информацию о Java-разработке.
- Наша страница «О нас» содержит дополнительную информацию о сайте, на котором вы находитесь, TheServerSide.com.
- Если вам нужно, свяжитесь с нами, мы будем рады услышать от вас.
Просмотр по категории
Архитектура приложения
- Azure Logic Apps: чем они отличаются от AWS Step Functions
Разработчики могут использовать Microsoft Azure Logic Apps для создания, развертывания и подключения масштабируемых облачных рабочих процессов. Узнайте, как он измеряет …
- 5 способов справиться с проблемами монолитных архитектур
Тем, кто не может перейти на микросервисы, нужен способ повысить надежность архитектуры. Вот пять способов программного обеспечения…
- Rust vs. Go: противостояние языков на основе микросервисов
Rust и Go предлагают языковые функции, ориентированные на разработку на основе микросервисов, но их относительные возможности делают их…
Качество ПО
- Нагрузочное тестирование Azure теперь GA с новой скоростью и параметрами безопасности
Microsoft Azure Load Testing внедряет новые функции для создания быстрых нагрузочных тестов, безопасной отправки кода в тестовую среду и…
- Инструмент управления потоком создания ценности Jellyfish устраняет узкие места
Jellyfish добавляет данные о потоке создания ценности в свой инструмент отслеживания производительности для инженерных групп, которые хотят устранить неэффективность в . ..
- 4 важных метода кэширования API, которые должны знать все разработчики
Кэширование API
может увеличить производительность и время отклика приложения, но только если оно сделано правильно. Узнайте о некоторых из …
Облачные вычисления
- Модель FinOps упрощает выставление счетов за облако
Управление стоимостью облачных вычислений является главным приоритетом для администраторов. Эксперт FinOps Майк Фуллер рассказывает о проблемах облачного биллинга и о том, как …
- Oracle официально поддерживает Red Hat Enterprise Linux на OCI
Отвечая на запросы пользователей, Oracle заключила сделку с Red Hat, чтобы сделать операционную систему Enterprise Linux неотъемлемой частью …
- Последний Google Cloud AI проливает свет на автоматизацию розничной торговли
Автоматизированные системы отслеживания запасов на базе искусственного интеллекта не идеальны. Однако ритейлерам с высокими показателями упущенных продаж не хватает…
Безопасность
- CERT, CSIRT и SOC: в чем разница?
Что в имени? Проанализируйте истинные различия между CERT, CSIRT, CIRT и SOC, прежде чем решить, что лучше для вашего …
- Топ-10 типов угроз информационной безопасности для ИТ-команд
Распространенные угрозы безопасности варьируются от внутренних угроз до продвинутых постоянных угроз, и они могут довести организацию до …
- 10 типов инцидентов безопасности и как с ними справляться
Кибератаки более разнообразны, чем когда-либо. Узнайте об основных симптомах, сигнализирующих о проблеме, и о том, как реагировать, чтобы сохранить системы и данные …
ПоискAWS
- AWS Control Tower стремится упростить управление несколькими учетными записями
Многие организации изо всех сил пытаются управлять своей огромной коллекцией учетных записей AWS, но Control Tower может помочь. Услуга автоматизирует…
- Разбираем модель ценообразования Amazon EKS
В модели ценообразования Amazon EKS есть несколько важных переменных. Покопайтесь в цифрах, чтобы убедиться, что вы развернули службу…
- Сравните EKS и самоуправляемый Kubernetes на AWS
Пользователи
AWS сталкиваются с выбором при развертывании Kubernetes: запустить его самостоятельно на EC2 или позволить Amazon выполнить тяжелую работу с помощью EKS. См…
Сериализация в Java [объяснение преимуществ и примеров]
Эта статья о сериализации в Java прольет свет на механизм сериализации и ее преимущества. Также будет рассмотрено, как сериализовать объект и как сериализовать с использованием различных концепций Java, с примерами.
Что такое сериализация в Java?
Сериализация в Java — это концепция представления состояния объекта в виде потока байтов. Поток байтов содержит всю информацию об объекте. Обычно используемая в Hibernate, JMS, JPA и EJB, сериализация в Java помогает переносить код с одной JVM на другую, а затем десериализовать его там.
Десериализация — это процесс, полностью противоположный сериализации, при котором поток байтового типа данных преобразуется обратно в объект в памяти. Самое приятное в этих механизмах то, что оба они независимы от JVM, то есть вы сериализуете на одной JVM и десериализуете на другой.
Каковы преимущества сериализации?
Сериализация предлагает множество преимуществ. Некоторые из его основных преимуществ:
- Используется для маршалинга (путешествия состояния объекта по сети)
- Чтобы сохранить или сохранить состояние объекта
- Независимый JVM
- Легко понять и настроить
Замечания о сериализации в Java?
Чтобы сериализовать объект, необходимо выполнить несколько условий. Некоторые другие ключевые моменты необходимо выделить, прежде чем продолжить статью. Это условия и моменты, которые следует помнить при использовании сериализации в Java.
- Сериализация — это интерфейс маркера без метода или члена данных
- Вы можете сериализовать объект только путем реализации сериализуемого интерфейса
- Все поля класса должны быть сериализуемыми; в противном случае используйте ключевое слово transient (подробнее об этом позже)
- Дочерний класс не обязан реализовывать интерфейс Serializable, если это делает родительский класс
- Процесс сериализации сохраняет только нестатические элементы данных, но не статические или временные элементы данных
- По умолчанию String и все классы-оболочки реализуют интерфейс Serializable
Как сериализовать объект?
Поскольку теперь вы знаете, что такое сериализация в Java, и все соответствующие моменты, давайте углубимся в то, как сериализовать объект. Вы должны использовать метод writeObject() класса ObjectOutputStream для сериализации и метод readObject() класса InputObjectStream для целей десериализации.
Синтаксис для метода writeObject():
public final void writeObject(Object o) вызывает исключение ввода-вывода
Синтаксис для метода readObject():
public final Object readObject() выдает IOException, ClassNotFoundException
Давайте рассмотрим пример, чтобы понять, как сериализовать и десериализовать объект в Java.
Пример сериализации в Java
Следующий программный код сериализует объект студента и сохраняет его в файл с именем student.ser.
Пример десериализации в Java
В приведенном ниже коде вы увидите, как десериализовать объект учащегося, который был сериализован в приведенном выше примере.
Сериализация в Java с наследованием (отношение Is-A)
Как упоминалось в разделе «Примечания», когда родительский класс реализует интерфейс Serializable, дочерние классы не обязаны этого делать. Давайте посмотрим на этот момент в действии на этом примере сериализации Java в наследовании.
Сериализация в Java с агрегацией (имеет связь)
В приведенном ниже коде объект Student не будет сериализован, поскольку класс Address не реализует интерфейс Serializable и пытается использовать ссылку из класса Address для сериализации класса Student. Это означает, что если вы хотите сериализовать объект со ссылкой на другой класс, все ссылки должны быть сериализуемыми, иначе будет выброшено исключение NotSerializableException.
Сериализация игнорирует статические элементы данных в Java. В приведенном ниже примере вы будете использовать статический элемент данных и сериализовать объект. Но поскольку сериализация не повлияет на статические данные, его значение можно будет изменить перед его десериализацией.
Что такое временное ключевое слово?
Transient — это зарезервированное ключевое слово в Java.