Java — Сериализация
Java предоставляет механизм, называемый сериализацией объектов, где объект может быть представлен в виде последовательности байтов, которая включает в себя данные объекта, а также информацию о типе объекта и типах данных, хранящихся в объекте.
После записи сериализованного объекта в файл его можно прочитать из файла и десериализовать, то есть информацию о типе и байты, представляющие объект и его данные, можно использовать для воссоздания объекта в памяти.
Наиболее впечатляющим является то, что весь процесс не зависит от JVM, а это означает, что объект можно сериализовать на одной платформе и десериализовать на совершенно другой платформе.
Классы ObjectInputStream и ObjectOutputStream — это высокоуровневые потоки, содержащие методы сериализации и десериализации объекта.
Класс ObjectOutputStream содержит множество методов записи для записи различных типов данных, но один из них особенно выделяется —
01
Приведенный выше метод сериализует объект и отправляет его в выходной поток. Точно так же класс ObjectInputStream содержит следующий метод для десериализации объекта —
10пре>Этот метод извлекает следующий объект из потока и десериализует его. Возвращаемое значение — Object, поэтому вам нужно будет привести его к соответствующему типу данных.
Чтобы продемонстрировать, как сериализация работает в Java, я буду использовать класс Employee, который мы обсуждали в начале книги. Предположим, что у нас есть следующий класс Employee, который реализует интерфейс Serializable —
Пример
28Обратите внимание, что для успешной сериализации класса должны быть выполнены два условия —
-
Класс должен реализовывать интерфейс java.io.Serializable.
-
Все поля в классе должны быть сериализуемыми. Если поле не сериализуемо, оно должно быть помечено как transient. .
Если вам интересно узнать, является ли стандартный класс Java сериализуемым или нет, ознакомьтесь с документацией по этому классу. Тест прост:если класс реализует java.io.Serializable, то он сериализуем; в противном случае это не так.
Сериализация объекта
Класс ObjectOutputStream используется для сериализации объекта. Следующая программа SerializeDemo создает экземпляр объекта Employee и сериализует его в файл.
После выполнения программы создается файл с именем employee.ser. Программа не генерирует никаких выходных данных, но изучает код и пытается определить, что делает программа.
Примечание − При сериализации объекта в файл стандартное соглашение в Java состоит в том, чтобы присвоить файлу .ser расширение.
Пример
32
Десериализация объекта
Следующая программа DeserializeDemo десериализует объект Employee, созданный в программе SerializeDemo. Изучите программу и попытайтесь определить ее вывод −
Пример
40
Это даст следующий результат —
Вывод
58
Здесь следует отметить следующие важные моменты —
-
Блок try/catch пытается перехватить исключение ClassNotFoundException, объявленное методом readObject(). Чтобы JVM могла десериализовать объект, она должна иметь возможность найти байт-код для класса. Если JVM не может найти класс во время десериализации объекта, она генерирует исключение ClassNotFoundException.
-
Обратите внимание, что возвращаемое значение readObject() приводится к ссылке Employee.
-
Значение поля SSN было 11122333 при сериализации объекта, но поскольку это поле является временным, это значение не было отправлено в выходной поток. Поле SSN десериализованного объекта Employee равно 0.
java