Лабораторная работа: Сериализация объектов
this.getContentPane().add(pane);
В программе требуется информация о выделенной строке таблицы. Для получения данных необходимо:
1. Ограничить пользователя выбором одной строки. Для этого необходимо задать режим выбора строк таблицы.
table.getSelectionModel().setSelectionMode(mode)
Параметрmode принимаеттризначения:
0 – выбирается одна строка.
1 – несколько смежных строк.
2 – несколько произвольных строк.
2. Для получения номера выбранной строки воспользоваться методом getSelectedRow().
Примечание: Для режима выбора нескольких строк существует метод getSelectedRows(), возвращающий массив int[] номеров выделенных строк.
Приложение 5. Сериализация объектов
Методы классов ObjectInputStream и ObjectOutputStream позволяют прочитать из входного байтового потока или записать в выходной байтовый поток данные сложных типов – объекты, массивы, строки – подобно тому, как методы классов DataInputStream и DataOutputStream читают и записывают данные простых типов.
Сходство усиливается тем, Что классы Objectxxx содержат методы как для чтений, так и записи простых типов. Впрочем, эти методы предназначены не для использования в программах, а для записи / чтения полей объектов и элементов массивов.
Процесс записи объекта в выходной поток получил название сериализации (serialization), а чтения объекта из входного потока и восстановления его в оперативной памяти – десериализации (deserialization).
Сериализация объекта нарушает его безопасность, поскольку зловредный процесс может сериализовать объект в массив, переписать некоторые элементы массива, представляющие private‑поля объекта, обеспечив себе, например, доступ к секретному файлу, а затем десериализовать объект с измененными полями и совершить с ним недопустимые действия.
Поэтому сериализации можно подвергнуть не каждый объект, а только тот, который реализует интерфейс Serializable. Этот интерфейс не содержит ни полей, ни методов. Реализовать в нем нечего. По сути дела запись
class A implements Serializable{…}
это только пометка, разрешающая сериализацию класса А.
В Java процесс сериализации максимально автоматизирован. Достаточно создать объект класса ObjectOutputStream, связав его с выходным потоком, и выводить в этот поток объекты методом writeObject():
MyClass me = new MyClass («abc», -12, 5.67e‑5);
int[] arr = {10, 20, 30};
ObjectOutputStream oos = new ObjectOutputStream (
new FileOutputStream («myobjects.ser»));
oos.writeObject(me);
oos.writeObject(arr);
oos.writeObject («Some string»);
oos.writeObject (new Date());
oos.flush();
В выходной поток выводятся все нестатические поля объекта, независимо от прав доступа к ним, а также сведения о классе этого объекта, необходимые для его правильного восстановления при десериализации. Байт-коды методов класса не сериализуются.
Если в объекте присутствуют ссылки на другие объекты, то они тоже сериализуются, а в них могут быть ссылки на другие объекты, которые опять-таки сериализуются, и получается целое множество причудливо связанных между собой сериализуемых объектов. Метод writeObject() распознает две ссылки на один объект и выводит его в выходной поток только один раз. К тому же, он распознает ссылки, замкнутые в кольцо, и избегает зацикливания.