48927 (Сериализация объектов), страница 2

2016-07-28СтудИзба

Описание файла

Документ из архива "Сериализация объектов", который расположен в категории "". Всё это находится в предмете "информатика" из 1 семестр, которые можно найти в файловом архиве . Не смотря на прямую связь этого архива с , его также можно найти и в других разделах. Архив можно найти в разделе "лабораторные работы", в предмете "информатика, программирование" в общих файлах.

Онлайн просмотр документа "48927"

Текст 2 страницы из документа "48927"

});

saveAs.addActionListener (new ActionListener() {

public void actionPerformed (ActionEvent e) {

FileDialog fd = new FileDialog (new Frame(),

«Сохранить», FileDialog.SAVE);

fd.setVisible(true);

}

});

exit.addActionListener (new ActionListener() {

public void actionPerformed (ActionEvent e) {System.exit(0);}

});

MenuItem about = new MenuItem («О программе»);

h.add(about);

about.addActionListener (

 // …обработчик

);

addWindowListener (new WinClose());

setVisible(true);

} // конец конструктора

 // вложенный класс – обработчик события закрытия окна

class WinClose extends WindowAdapter {

public void windowClosing (WindowEvent e) {System.exit(0);}

}

public static void main (String[] args) {

new MenuScribble («Программа с меню»);

}

}



Приложение 2. Контейнер Dialog

Контейнер Dialog – это окно обычно фиксированного размера, предназначенное для ответа на сообщения приложения. Оно автоматически регистрируется в оконном менеджере графической оболочки, следовательно, его можно перемещать по экрану, менять его размеры. Но окно типа Dialog, как и его суперкласс – окно типа Window, – обязательно имеет владельца owner, который указывается в конструкторе. Окно типа Dialog может быть модальным (modal), в котором надо обязательно выполнить все предписанные действия, иначе из окна нельзя будет выйти.

В классе семь конструкторов. Из них:

  • Dialog (Dialog owner) – создает немодальное диалоговое окно с пустой строкой заголовка;

  • Dialog (Dialog owner, String title) – создает немодальное диалоговое окно со строкой заголовка title;

  • Dialog (Dialog owner, String title, boolean modal) – создает диалоговое окно, которое будет модальным, если modal == true.

Четыре других конструктора аналогичны, но создают диалоговые окна, принадлежащие окну типа Frame:

Dialog (Frame owner)

Dialog (Frame owner, String title)

Dialog (Frame owner, boolean modal)

Dialog (Frame owner, String title, boolean modal)

Среди методов класса интересны методы: isModal(), проверяющий состояние модальности, и setModal (boolean modal), меняющий это состояние.

События

Кроме Событий класса Component: ComponentEvent, FocusEvent, KeyEvent, MouseEvent, при изменении размеров окна, его перемещении или удалении с экрана, а также показа на экране происходит событие WindowEvent.

В примере 1 создается модальное окно доступа, в которое вводится имя и пароль. Пока не будет сделан правильный ввод, другие действия невозможны. На рисунке 2 показан вид этого окна.

Пример 1. Модальное окно доступа

import java.awt.*;

import java.awt.event.*;

class LoginWin extends Dialog {

LoginWin(Frame f, String s) {

super (f, s, true);

setLayout(null);

setFont (new Font («Serif», Font.PLAIN, 14));

Label l1 = new Label («Ваше имя:», Label.RIGHT);

l1.setBounds (20, 30, 70, 25); add(l1);

Label l2 = new Label («Пароль:», Label.RIGHT);

l2.setBounds (20, 60, 70, 25); add(l2);

TextField tf1 = new TextField(30);

tf1.setBounds (100, 30, 160, 25); add(tf1);

TextField tf2 = new TextField(30);

tf2.setBounds (100, 60, 160, 25); add(tf2);

tf2.setEchoChar ('*');

Button b1 = new Button («Применить»);

b1.setBounds (50, 100, 100, 30); add(b1);

Button b2 = new Button («Отменить»);

b2.setBounds (160, 100, 100, 30); add(b2);

setBounds (50, 50, 300, 150);

}

}

class DialogTest extends Frame {

DialogTest(String s) {

super(s);

setLayout(null);

setSize (200, 100);

setVisible(true);

Dialog d = new LoginWin (this, «Окно входа»);

d.setvisible(true);

}

public static void main (String[] args) {

Frame f = new DialogTest (» Окно-владелец»);

f.addWindowListener (new WindowAdapter() {

public void windowClosing (WindowEvent ev) {

System.exit(0);

}

});

}

}

Рисунок 2. Модальное окно доступа


Приложение 3. Контейнер FileDialog.

Контейнер FileDialog – это модальное окно с владельцем типа Frame, содержащее стандартное окно выбора файла операционной системы для открытия (константа LOAD) или сохранения (константа SAVE). Окна операционной системы создаются и помещаются в объект класса FileDialog автоматически.

В классе три конструктора:

  • FileDialog (Frame owner) – создает окно с пустым заголовком для открытия файла;

  • FileDialog (Frame owner, String title) – создает окно открытия файла с заголовком title;

  • FileDialog (Frame owner, String title, int mode) – создает окно открытия или сохранения документа; аргумент mode имеет два значения: FileDialog.LOAD и FileDialog.SAVE.

Методы класса getDirectory() и getFile() возвращают только выбранный каталог и имя файла в виде строки String. Загрузку или сохранение файла затем нужно производить методами классов ввода / вывода.

Можно установить начальный каталог для поиска файла и имя файла методами setDirectory (String dir) и setFile (String fileName).

Вместо конкретного имени файла fileName можно написать шаблон, например, *.java (первые символы – звездочка и точка), тогда в окне будут видны только имена файлов, заканчивающиеся точкой и словом java.

Метод setFilenameFilter (FilenameFilter filter) устанавливает шаблон filter для имени выбираемого файла. В окне будут видны только имена файлов, подходящие под шаблон. Этот метод не реализован в SUN JDK на платформе MS Windows.

События

Кроме событий класса Component: ComponentEvent, FocusEvent, KeyEvent, MouseEvent, при изменении размеров окна, его перемещении или удалении с экрана, а также показа на экране происходит событие WindowEvent.



Приложение 4. Создание таблиц

Для создания таблиц используется компонент JTable, обладающий довольно сложной структурой, которая, впрочем, скрыта от пользователя. Таким образом, на основе лишь нескольких строк кода возможно получить полнофункциональную таблицу.

Компонент JTable не хранит информацию о содержимом в себе, а использует т.н. модель таблицы. Для создания модели предусмотрен специальный класс AbstractTableModel, в котором необходимо переопределить следующие методы:

public int getRowCount(); – возвращает количество строк в таблице.

public int getColumnCount(); – возвращает количество столбцов.

public object getValueAt (int row, int column); – возвращает содержимое ячейки в ряду row и столбце column.

Как видно из прототипа метода, в ячейке таблицы может находиться любой объект, в частности, строка или картинка. Для помещения числа в ячейку, необходимо использовать соответствующий числовой объект:

return new Integer(100);

Для задания названий столбцам таблицы необходимо переопределить метод:

public int getColumnName (int c);

Параметр с указывает на номер столбца. Внутри должна быть конструкция switch-case (или if-else), возвращающая на каждый номер с названием колонки.

public String getColumnName (int c) {

if (c == 0)

return «Ф.И.О.»;

else if (c == 1)

return «Должность»;

else if (c==2)

return «Зарплата»;

else if (c == 3)

return «Год»;

else if (c == 4)

return «Месяц»;

else if (c == 5)

return «День»;

else

return null;

}

Также в абстрактной модели таблицы можно непосредственно хранить данные в том или ином виде и предусмотреть методы для их модификации. После модификации данных нужно сообщить JTable о том, что структура таблицы / количество строк изменились, для этого используются такие методы класса AbstractTableModel, как fireRowsInserted и пр.

Далее создаётся экземпляр класса JTable, в конструкторе которого указываются объект модели таблицы:

JTable empTable = new JTable(myTableModel);

Модель таблицы может быть указана и позже с помощью метода setModel.

И, наконец, для создания полос прокрутки на элементе воспользуемся стандартным методом – поместим таблицу на панель типа JScrollPane:

JScrollPane pane= new JScrollPane(empTable);

Осталось разместить готовую панель на форме. Воспользуемся следующим кодом:

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() распознает две ссылки на один объект и выводит его в выходной поток только один раз. К тому же, он распознает ссылки, замкнутые в кольцо, и избегает зацикливания.

Все классы объектов, входящих в такое сериализуемое множество, а также все их внутренние классы, должны реализовать интерфейс Serializable, в противном случае будет выброшено исключение класса NotSerializableException и процесс сериализации прервется. Многие классы J2SDK реализуют этот интерфейс. Учтите также, что все потомки таких классов наследуют реализацию (может быть сериализацию?). Например, класс java.awt. Component реализует интерфейс Serializable, значит, все графические компоненты можно сериализовать. Не реализуют этот интерфейс обычно классы, тесно связанные с выполнением программ, например, java.awt. Toolkit. Состояние экземпляров таких классов нет смысла сохранять или передавать по сети. Не реализуют интерфейс Serializable и классы, содержащие внутренние сведения Java «для служебного пользования».

Десериализация происходит так же просто, как и сериализация:

Свежие статьи
Популярно сейчас
Почему делать на заказ в разы дороже, чем купить готовую учебную работу на СтудИзбе? Наши учебные работы продаются каждый год, тогда как большинство заказов выполняются с нуля. Найдите подходящий учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
5184
Авторов
на СтудИзбе
435
Средний доход
с одного платного файла
Обучение Подробнее