Что подразумевается под «сериализацией объекта»? Можете ли вы объяснить это с некоторыми примерами?
384
Что подразумевается под «сериализацией объекта»? Можете ли вы объяснить это с некоторыми примерами?
Ответы:
Сериализация - это преобразование объекта в серию байтов, так что объект может быть легко сохранен в постоянном хранилище или передан по каналу связи. Затем поток байтов может быть десериализован - преобразован в точную копию исходного объекта.
источник
Вы можете думать о сериализации как о процессе преобразования экземпляра объекта в последовательность байтов (которая может быть двоичной или не зависящей от реализации).
Это очень полезно, когда вы хотите передать данные одного объекта по сети, например, из одной JVM в другую.
В Java механизм сериализации встроен в платформу, но вам нужно реализовать интерфейс Serializable, чтобы сделать объект сериализуемым.
Вы также можете предотвратить сериализацию некоторых данных в вашем объекте, пометив атрибут как временный .
Наконец, вы можете переопределить механизм по умолчанию и предоставить свой собственный; это может быть подходящим в некоторых особых случаях. Для этого вы используете одну из скрытых функций в Java .
Важно отметить, что сериализуемым является «значение» объекта или содержимого, а не определение класса. Таким образом, методы не сериализуются.
Вот очень простой пример с комментариями для облегчения его чтения:
Когда мы запускаем эту программу, создается файл «o.ser», и мы видим, что произошло позади.
Если мы изменим значение: someInteger , например, Integer.MAX_VALUE , мы можем сравнить вывод, чтобы увидеть, в чем разница.
Вот скриншот, показывающий именно эту разницу:
Можете ли вы определить различия? ;)
В сериализации Java есть еще одно релевантное поле: serialversionUID, но, думаю, это уже слишком долго, чтобы его охватить.
источник
SerializationSample
SerializationSample instance = new SerializationSample();
затем создается выход, и объект записывается в этот вывод.Смею ответить на 6-летний вопрос, добавив только очень высокого уровня понимания для людей, плохо знакомых с Java
Преобразование объекта в байты
Преобразование байтов обратно в объект (десериализация).
Когда мы хотим сохранить объект. Когда мы хотим, чтобы объект существовал после жизненного цикла JVM.
Банкомат. Когда владелец счета пытается вывести деньги с сервера через банкомат, информация о владельце счета, такая как информация о снятии, будет сериализована и отправлена на сервер, где данные будут десериализованы и использованы для выполнения операций.
Воплощать в жизнь
java.io.Serializable
интерфейс (маркерный интерфейс, поэтому нет способа реализовать).Сохранять объект: использовать
java.io.ObjectOutputStream
класс, поток фильтра, который является оберткой вокруг потока байтов более низкого уровня (чтобы записать объект в файловые системы или передать плоский объект по сетевому проводу и перестроить на другой стороне).writeObject(<<instance>>)
- написать объектreadObject()
- прочитать сериализованный объектКогда вы сериализуете объект, будет сохранено только состояние объекта, а не файл класса объекта или методы.
Когда вы сериализовали 2-байтовый объект, вы видите 51-байтовый сериализованный файл.
Ответ для: Как он преобразовал файл в 51 байт?
java.lang.Object
.Изменить : еще одна хорошая ссылка для чтения.
Это ответит на несколько частых вопросов:
Как не сериализовать ни одно поле в классе.
Ответ: используйте временное ключевое слово
Когда дочерний класс сериализуется, родительский класс сериализуется?
Ответ: Нет, если родительский объект не расширяет поле родителей интерфейса Serializable, сериализация не выполняется.
При сериализации родительского класса сериализуется ли дочерний класс?
Ответ: Да, по умолчанию дочерний класс также сериализуется.
Как предотвратить сериализацию дочернего класса?
Ответ: а. Переопределите метод writeObject, readObject и throw
NotSerializableException
.б. также вы можете отметить все переходные поля в дочернем классе.
источник
Сериализация берет «живой» объект в памяти и преобразует его в формат, который можно где-то сохранить (например, в памяти, на диске), а затем «десериализовать» обратно в живой объект.
источник
Мне понравилось, как @OscarRyz представляет. Хотя здесь я продолжаю историю сериализации которая была изначально написана @amitgupta.
Даже зная о структуре классов роботов и имея сериализованные данные, ученые Земли не смогли десериализовать данные, которые могут заставить роботов работать.
Ученые Марса ждали полной оплаты. Как только оплата была произведена, ученые Марса поделились серийной версией UID с учеными Земли. Ученый Земли установил класс роботов, и все стало хорошо.
источник
Сериализация означает сохранение объектов в Java. Если вы хотите сохранить состояние объекта и хотите восстановить состояние позднее (возможно, в другой JVM), можно использовать сериализацию.
Обратите внимание, что свойства объекта будут только сохранены. Если вы хотите воскресить объект снова, у вас должен быть файл класса, потому что будут храниться только переменные-члены, а не функции-члены.
например:
Searializable - интерфейс маркера, который отмечает, что ваш класс сериализуем. Маркерный интерфейс означает, что это просто пустой интерфейс, и использование этого интерфейса уведомит JVM о том, что этот класс можно сделать сериализуемым.
источник
Мои два цента из моего собственного блога:
Вот подробное объяснение Сериализации : (мой собственный блог)
Сериализация:
Сериализация - это процесс сохранения состояния объекта. Он представлен и хранится в виде последовательности байтов. Это может быть сохранено в файле. Процесс чтения состояния объекта из файла и его восстановления называется десериализацией.
Зачем нужна сериализация?
В современной архитектуре всегда необходимо сохранять состояние объекта, а затем извлекать его. Например, в Hibernate, чтобы сохранить объект, мы должны сделать класс Serializable. Что он делает, так это то, что после сохранения состояния объекта в виде байтов его можно перенести в другую систему, которая затем может прочитать из состояния и извлечь класс. Состояние объекта может поступать из базы данных, другого jvm или отдельного компонента. С помощью сериализации мы можем получить состояние объекта.
Пример кода и объяснение:
Сначала давайте посмотрим на класс предметов:
В приведенном выше коде видно, что класс Item реализует Serializable .
Это интерфейс, который позволяет классу быть сериализуемым.
Теперь мы видим, что переменная с именем serialVersionUID инициализируется переменной Long. Это число вычисляется компилятором на основе состояния класса и атрибутов класса. Это число, которое поможет jvm идентифицировать состояние объекта, когда он читает состояние объекта из файла.
Для этого мы можем взглянуть на официальную документацию Oracle:
Если вы заметили, что мы использовали другое ключевое слово, которое является временным .
Если поле не сериализуемо, оно должно быть помечено как временное. Здесь мы отметили itemCostPrice как временный и не хотим, чтобы он был записан в файл
Теперь давайте посмотрим, как записать состояние объекта в файле, а затем прочитать его оттуда.
В приведенном выше примере мы видим пример сериализации и десериализации объекта.
Для этого мы использовали два класса. Для сериализации объекта мы использовали ObjectOutputStream. Мы использовали метод writeObject для записи объекта в файл.
Для десериализации мы использовали ObjectInputStream, который читает объект из файла. Он использует readObject для чтения данных объекта из файла.
Вывод приведенного выше кода будет выглядеть так:
Обратите внимание, что itemCostPrice из десериализованного объекта является нулевым поскольку оно не было записано.
Мы уже обсуждали основы Java-сериализации в первой части этой статьи.
Теперь давайте обсудим это глубоко и как это работает.
Сначала давайте начнем с serialversionuid.
serialVersionUID используется в качестве контроля версий в сериализуемом классе.
Если вы явно не объявите serialVersionUID, JVM сделает это за вас автоматически, основываясь на различных свойствах класса Serializable.
Алгоритм вычисления Java-версии (см. Подробнее здесь)
Алгоритм сериализации Java
Что нужно иметь в виду:
Статические поля в классе не могут быть сериализованы.
Если serialversionuid отличается в классе чтения, он выдаст
InvalidClassException
исключение.Если класс реализует сериализуемый, то все его подклассы также будут сериализуемыми.
Если класс имеет ссылку на другой класс, все ссылки должны быть сериализуемыми, иначе процесс сериализации не будет выполнен. В таком случае NotSerializableException выбрасывается во время выполнения.
Например:
источник
serialVersionUID
отличается, он будет бросатьInvalidClassException
, а неClassCastException
. Нет необходимости тратить все это пространство на повторноеserialVersionUID
вычисление. Документация цитируется, чрезмерно длинна, но не связана или не процитирована должным образом. Здесь слишком много пуха и слишком много ошибок.Сериализация - это процесс преобразования состояния объекта в биты, чтобы его можно было сохранить на жестком диске. Когда вы десериализуете тот же объект, он сохранит свое состояние позже. Это позволяет вам воссоздавать объекты без необходимости сохранять свойства объектов вручную.
http://en.wikipedia.org/wiki/Serialization
источник
Сериализация объектов Java
Serialization
это механизм для преобразования графа Java-объектов в массив байтов для storage (to disk file
) или translation (across a network
), тогда с помощью десериализации мы можем восстановить граф объектов. Графики объектов корректно восстанавливаются с помощью механизма разделения ссылок. Но перед сохранением проверьте, совпадают ли serialVersionUID из файла ввода / сети и файла .class serialVersionUID. Если нет, киньтеjava.io.InvalidClassException
.serialVersionUID необходим для процесса сериализации. Но для разработчика необязательно добавлять его в исходный файл Java. Если serialVersionUID не включен, среда выполнения сериализации сгенерирует serialVersionUID и свяжет его с классом. Сериализованный объект будет содержать этот serialVersionUID вместе с другими данными.
Примечание. Настоятельно рекомендуется, чтобы все сериализуемые классы явно объявляли serialVersionUID
since the default serialVersionUID computation is highly sensitive to class details that may vary depending on compiler implementations
и, таким образом, могли привести к неожиданным конфликтам serialVersionUID во время десериализации, что приведет к сбою десериализации.Проверка Сериализуемых Классов
Класс должен реализовывать интерфейс java.io.Serializable для успешной сериализации своего объекта. Serializable - это маркерный интерфейс, используемый для информирования компилятора о том, что к классу, реализующему его, необходимо добавить сериализуемое поведение. Здесь виртуальная машина Java (JVM) отвечает за ее автоматическую сериализацию.
Реализация интерфейса Externalizable позволяет объекту взять на себя полный контроль над содержимым и форматом сериализованной формы объекта. Методы интерфейса Externalizable, writeExternal и readExternal, вызываются для сохранения и восстановления состояния объектов. При реализации классом они могут писать и читать свое собственное состояние, используя все методы ObjectOutput и ObjectInput. Объекты несут ответственность за обработку любых возникающих версий.
Только объекты , которые поддерживают интерфейс java.io.Serializable или java.io.Externalizable может быть
written to
/read from
потоков. Класс каждого сериализуемого объекта кодируется, включая имя класса и сигнатуру класса, значения полей и массивов объекта и закрытие любых других объектов, на которые ссылаются исходные объекты.Сериализуемый пример для файлов
Сериализуемый пример по сети
Распределительный объект по разным адресным пространствам, либо в разных процессах на одном компьютере, либо даже на нескольких компьютерах, подключенных через сеть, но которые работают вместе, обмениваясь данными и вызывая методы.
@видеть
источник
JVM to JVM
Сериализация - это процесс сохранения объекта на носителе данных (например, файла или буфера памяти) или его передачи по сетевому соединению в двоичном виде. Сериализованные объекты независимы от JVM и могут быть повторно сериализованы любой JVM. В этом случае состояние «в памяти» объектов Java преобразуется в поток байтов. Этот тип файла не может быть понят пользователем. Это особые типы объектов, т.е. повторно используемые JVM (виртуальной машиной Java). Этот процесс сериализации объекта также называется дефлятированием или маршалингом объекта.
Объект для сериализации должен реализовывать
java.io.Serializable
интерфейс. Механизм сериализации по умолчанию для объекта записывает класс объекта, сигнатуру класса и значения всех непереходных и нестатических полей.ObjectOutput
Интерфейс расширяетDataOutput
интерфейс и добавляет методы для сериализации объектов и записи байтов в файл.ObjectOutputStream
Расширяетjava.io.OutputStream
и реализуетObjectOutput
интерфейс. Он сериализует объекты, массивы и другие значения в поток. Таким образом, конструкторObjectOutputStream
записывается как:Приведенный выше код был использован для создания экземпляра
ObjectOutput
класса с помощьюObjectOutputStream( )
конструктора, который принимает экземпляр класса вFileOuputStream
качестве параметра.ObjectOutput
Интерфейс используется путем реализацииObjectOutputStream
класса. СозданObjectOutputStream
для сериализации объекта.Десериализация объекта в Java
Противоположная операция сериализации называется десериализацией, т. Е. Извлечение данных из серии байтов называется десериализацией, которая также называется надуванием или демаршированием.
ObjectInputStream
расширяетjava.io.InputStream
и реализуетObjectInput
интерфейс. Он десериализует объекты, массивы и другие значения из входного потока. Таким образом, конструкторObjectInputStream
записывается как:Выше код программы создает экземпляр
ObjectInputStream
класса для десериализации этого файла, который был сериализованObjectInputStream
классом. Приведенный выше код создает экземпляр, используя экземплярFileInputStream
класса, который содержит указанный файловый объект, который должен быть десериализован, посколькуObjectInputStream()
конструктору требуется входной поток.источник
Сериализация - это процесс превращения объекта Java в байтовый массив, а затем обратно в объект с сохраненным состоянием. Полезно для различных вещей, таких как отправка объектов по сети или кеширование на диск.
Прочитайте больше из этой короткой статьи, которая довольно хорошо объясняет программирование части процесса, а затем перейдите к Serializable javadoc . Вам также может быть интересно прочитать этот связанный вопрос .
источник
Верните файл как объект: http://www.tutorialspoint.com/java/java_serialization.htm
источник
| * | Сериализация класса: преобразование объекта в байты и байты обратно в объект (десериализация).
| => Object-Serialization - это процесс преобразования состояния объекта в пару байтов.
| => Объектная десериализация - это процесс получения состояния объекта и сохранения его в объекте (java.lang.Object).
Если не выбрасывать исключение java.io.InvalidClassException.
| => Java-объект сериализуем, только если его класс или любой из его суперклассов
| => Статические поля в классе не могут быть сериализованы.
| => Если вы не хотите сериализовать переменную класса, используйте ключевое слово transient
| => Если класс реализует сериализуемый, то все его подклассы также будут сериализуемыми.
| => Если класс имеет ссылку на другой класс, все ссылки должны быть сериализуемыми, иначе процесс сериализации не будет выполнен. В таком случае
NotSerializableException выбрасывается во время выполнения.
источник
Я предложу аналогию, чтобы потенциально помочь в укреплении концептуальной цели / практичности сериализации / десериализации объектов .
Я представляю сериализацию / десериализацию объекта в контексте попытки перемещения объекта через ливневую канализацию. Объект по существу «декомпозируется» или сериализуется в более модульные версии самого себя - в данном случае, серии байтов - для эффективного предоставления прохода через среду. В вычислительном смысле мы могли бы рассматривать путь, пройденный байтами через ливень, как сродни байту, проходящему через сеть. Мы трансмутируем наш объект, чтобы соответствовать более желаемому виду транспорта или формату. Сериализованный объект, как правило, будет храниться в двоичном файле, который впоследствии можно будет прочитать, записать или оба.
Возможно, когда наш объект сможет проскользнуть через сток в виде разложенной серии байтов, мы можем захотеть сохранить это представление объекта в виде двоичных данных в базе данных или на жестком диске. Однако основной вывод заключается в том, что при сериализации / десериализации у нас есть возможность оставить наш объект в двоичном виде после сериализации или «извлечь» исходную форму объекта путем выполнения десериализации.
источник