- •К экзамену
- •1 Семестр
- •1.Общая характеристика Java
- •2. Жизненный цикл программы Java
- •3. Лексические основы Java
- •4. Операции в Java
- •5. Примитивные типы данных
- •6. Булевские переменные и булевская алгебра
- •7. Условный оператор
- •9. Оператор Break
- •10. Оператор Switch
- •11. Цикл While
- •12. Цикл Do
- •13. Цикл For
- •14. Одномерные массивы
- •15. Многомерные массивы
- •16. Введение в строки
- •Преимущества:
- •Недостатки:
- •Преимущества:
- •Недостатки:
- •17. Основные конструкторы класса String
- •Работа со строками (класс String)
- •21. Класс StringBuffer
- •22. Методы StringBuffer
- •23. Класс StringTokenizer и его методы
- •24. Общие понятия об ооп
- •28. Определение классов и методов
- •29. Модификаторы доступа
- •30. Описание методов
- •38. Статические переменные
- •39. Перегрузка метода
- •40. Рекурсивные методы
- •41. Конструкторы
- •42. Инициализаторы
- •43. Реализация наследования в Java
- •44. Производные методы
- •Замечание
- •Типы исключений
- •2. Блоки try-catch-throw
- •Несколько разделов catch
- •Вложенные операторы try
- •Throw ОбъектТипаThrowable;
- •3. Иерархия классов исключительных ситуаций
- •4. Базовые классы исключений и их методы
- •5. Проверяемые и непроверяемые исключения
- •6. Создание собственных классов исключений
- •7. Типы коллекций в Java
- •8. Класс ArrayList, конструкторы, основные методы
- •9. Класс LinkedList и его методы
- •10. Общая характеристика потоков Java
- •Создание потоков
- •Запуск и остановка
- •Приостановка и возобновление
- •11. Иерархия типов в java.Io
- •12. Класс InputStream и его методы
- •19. Класс File
- •Класс DataInputStream (производный от InputStream)
- •Класс DataOutputStream (производный от OutputStream)
- •Классы BufferedInputStream и BufferedOutputStream
- •Класс RandomAccessFile
- •Классы InputStreamReader и OutputStreamWriter (производные от Reader и Writer)
- •Классы FileReader и FileWriter
- •Зачем сериализация нужна?
- •Как сериализовать объект?
- •Формат сериализованного объекта
- •Алгоритм сериализации Java
- •21. Форматирование данных при выводе Методы printf и format
- •22. Класс Scanner, конструкторы, основные методы
- •23. Архитектура mvc (Model/View/Controller) Архитектура Model-View-Controller (mvc)
- •Еще Java фреймвоки
- •24. Gui общее понятия, принципы реализации в Java
- •25. Событийная модель Java
Зачем сериализация нужна?
В сегодняшнем мире типичное промышленное приложение будет иметь множество компонентов и будет распространено через различные системы и сети. В Java всё представлено в виде объектов; Если двум компонентам Java необходимо общаться друг с другом, то им необходим механизм для обмена данными. Есть несколько способов реализовать этот механизм. Первый способ это разработать собственный протокол и передать объект. Это означает, что получатель должен знать протокол, используемый отправителем для воссоздания объекта, что усложняет разработку сторонних компонентов. Следовательно, должен быть универсальный и эффективный протокол передачи объектов между компонентами. Сериализация создана для этого, и компоненты Java используют этот протокол для передачи объектов. Рисунок 1 демонстрирует высоко-уровневое представление клиент-серверной коммуникации, где объект передаётся с клиента на сервер посредством сериализации. Рисунок 1.
Как сериализовать объект?
Для начала следует убедиться, что класс сериализуемого объекта реализует интерфейс java.io.Serializableкак показано в листинге 1. Листинг 1.
import java.io.Serializable; class TestSerial implements Serializable { public byte version = 100; public byte count = 0; } * This source code was highlighted with Source Code Highlighter.
В Листинге 1 только одна вещь отличается от создания нормального класса, это реализация интерфейсаjava.io.Serializable. Интерфейс Serializable это интерфейс-маркер; в нём не задекларировано ни одного метода. Но говорит сериализующему механизму, что класс может быть сериализован. Теперь у нас есть всё необходимое для сериализации объекта, следующим шагом будет фактическая сериализация объекта. Она делается вызовом метода writeObject() класса java.io.ObjectOutputStream, как показано в листинге 2. Листинг 2.
public static void main(String args[]) throws IOException { FileOutputStream fos = new FileOutputStream("temp.out"); ObjectOutputStream oos = new ObjectOutputStream(fos); TestSerial ts = new TestSerial(); oos.writeObject(ts); oos.flush(); oos.close(); } * This source code was highlighted with Source Code Highlighter.
В листинге 2 показано сохранение состояния экземпляра TestSerial в файл с именем temp.out Для воссоздания объекта из файла, необходимо применить код из листинга 3. Листинг 3.
public static void main(String args[]) throws IOException { FileInputStream fis = new FileInputStream("temp.out"); ObjectInputStream oin = new ObjectInputStream(fis); TestSerial ts = (TestSerial) oin.readObject(); System.out.println("version="+ts.version); } * This source code was highlighted with Source Code Highlighter.
Восстановление объекта происходит с помощью вызова метода oin.readObject(). В методе происходит чтение набора байт из файла и создаие точной копии графа оригинального объекта. oin.readObject() может прочитать любой сериализованный объект, поэтому необходимо полученный объект приводить к конкретному типу. Выполненный код выведет version=100 в стандартный вывод.
Формат сериализованного объекта
Как должен выглядеть сериализованный объект? Вспомните простой код из предыдущего раздела, который сериализует объект класса TestSerial и записывает в temp.out. В листинге 4 показано содержимое файлаtemp.out, в шестнадцатеричном виде. Листинг 4.
AC ED 00 05 73 72 00 0A 53 65 72 69 61 6C 54 65 73 74 A0 0C 34 00 FE B1 DD F9 02 00 02 42 00 05 63 6F 75 6E 74 42 00 07 76 65 72 73 69 6F 6E 78 70 00 64
Если вы снова посмотрите на TestSerial, то увидите, что у него всего 2 байтовых члена. Как показано в листинге 5. Листинг 5.
public byte version = 100; public byte count = 0; * This source code was highlighted with Source Code Highlighter.
Размер байтовой переменной один байт, и следовательно полный размер объекта (без заголовка) — два байта. Но размер сериализованного объекта 51 байт. Удивлены? Откуда взялись эти дополнительные байты и что они обозначают? Они добавлены сериализующим алгоритмом и необходимы для воссоздания объекта. В следующем абзаце будет подробно описан этот алгоритм.