Oos.flush();
У вихідний потік виводяться всі нестатичні поля об’єкта, незалежно від прав доступу до них, а також дані про клас цього об’єкта, необхідні для його правильного відновлення при десеріалізації. Байт-коди методів класу не серіалізуються. Якщо в об’єкті присутні посилки на інші об’єкти, то вони теж серіалізуються, а в них можуть бути посилання на інші об’єкти, котрі знову-таки серіалізуються, і отримується ціла множина зв’язаних між собою серіалізованих об’єктів. Метод writeObject() розпізнає два посилання на один об’єкт і виводить його у вихідний потік тільки один раз. До того ж, він розпізнає посилання, замкнуті в кільце, і уникає зациклювання.
Всі класи об’єктів, що входять в таку серіалізовану множину, а також всі їх внутрішні класи, повинні реалізувати інтерфейс serializable, в протилежному випадку буде відкинуте виключення класу NotseriaІizabІeException і процес серіалізації перерветься.
Клас java.awt.Component реалізує інтерфейс Serializable, а це означає, що всі графічні компоненти можна серіалізувати. Не реалізують цей інтерфейс звичайно класи, тісно пов’язані з виконанням програм, наприклад, java.awt.Toolkit. Стан екземплярів таких класів немає рації зберігати або передавати по мережі. Не реалізують інтерфейс Serializable і класи, що містять внутрішні дані Java «для службового користування». Десеріалізація відбувається так же просто, як і серіалізація:
ObjectlnputStream ois = new ObjectInputStream
(new FilelnputStream("myobjects.ser"));
MyClass mcl = (MyClass)ois.readObject();
int[] a = (int[])ois.readObject();
String s = (String)ois.readObject();
Date d = (Date)ois.readObject();
Потрібно тільки додержуватися порядку читання елементів потоку. В лістинзі, поданому нижче, створюється об’єкт класу GregorianCaІendar з поточною датою і часом, серіалізується його у файл date.ser, через три секунди десеріалізується і зрівнюється з поточним часом:
import java.io.*;
import java.util.*;
Дата добавления: 2014-12-10; просмотров: 866;