![[ Java... in Russian!]](JavaInRussian.gif)
Перевод 1997 (C) Алексей Гузеев
* Сериализация (serialization) - от англ. serial - последовательный.
Как, вероятно, вам подсказывает имя этого механизма, сериализация преобразует объекты в поток байтов, который затем может быть просто сохранён в файле. Позже можно будет прочесть файл, и поток байт без проблем будет преобразован в исходные объекты.
Реляционные базы данных могут вам не подойти и в том случае, если вам необхомо хранить исключительно большие объёмы информации, и если если у вас много конечных пользователей требующих систему с высокой пропускной способностью. Учитывайте, что каждый раз, когда вам требуется записать/считать из реляционной базы данных, необходимо отображать информацию, хранимую в двумерных таблицах в объекты явы. Это отображение не только уменьшает продуктивность программиста, но и снижает общее быстродействие системы. Идеальное решение для больших, критичных приложений было-бы использование объектных баз данных. Хотя переучиваться достаточно сложно, это с лихвой окупится в будущем.
Листинг 1. Person.java
public class Person implements java.io.Serializable {
int id;
String name;
String addr;
public Person (int key, String n, String a) {
id=key;
name=n;
addr=a;
}
}
В классе Person нет ничего необычного, исключая то что он реализует интерфейс Serializable. Для того, чтобы объект мог быть преобразован в поток при сериализации необходимо реализовать интерфейс Serializable.
Листинг 2. Rolodex.java
class Rolodex implements java.io.Serializable {
Person[] data=new Person[5];
public Rolodex () {
data[0]=new Person(100, "Lazy Larry", "123 Easy Drive");
data[1]=new Person(101, "Happy Harry", "30 Sunset Ave" );
data[2]=new Person(102, "Big Bessie", "11 Market Way" );
data[3]=new Person(103, "Guitar Man", "461 Ocean Blvd");
data[4]=new Person(104, "Java Joe", "1 Hacker Ave" );
}
public void display () {
for (int i=0; i<5; i++) {
System.out.println("ID: "+data[i].id);
System.out.println("NAME: "+data[i].name);
System.out.println("ADDR: "+data[i].addr);
}
}
}
Класс Rolodex, показынный в листинге 2, также реализует интерфейс Serializable. Этот класс, по существу - массив объектов Person, инициализированный некоторыми значениями. А теперь мы можем заняться непосредственно сохранением и чтением объектов, используя сериализацию.
Листинг 3. RoloWrite.java
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
public class RoloWrite {
public static void main (String[] args) {
Rolodex rolodex=new Rolodex();
try {
FileOutputStream fo=new FileOutputStream("rolodata");
ObjectOutputStream serial=new ObjectOutputStream(fo);
serial.writeObject(rolodex);
serial.flush();
} catch (Exception ex) {
System.out.println("Ошибка при сериализации объекта");
}
}
}
Класс RoloWrite, показанный в листинге 3, демонстрирует насколько просто объекты явы могут быть записаны в файл, после преобразования их в поток байтов. Прежде всего мы создаём объект класса Rolodex, который мы собираемся сохранить. Объект класса FileOutputStream создан потому, что мы должны присоединить наш ObjectOutputStream к чему-нибудь. Объект класса ObjectOutputStream содержит теперь всю необходимую функциональность для сериализации любого объекта и записи его в поток.
Теперь, чтобы записать наш объект класса Rolodex в поток, нужно всего лишь вызвать метод writeObject класса ObjectOutputStream: serial.writeObject(rolodex);.
Заметьте, что мы совершенно не изменили класс объекта чтобы сделать его сохраняемым. Мы просто записываем объект в поток, как есть!
Листинг 4 RoloRead.java
import java.io.FileInputStream;
import java.io.ObjectInputStream;
public class RoloRead {
public static void main (String[] args) {
Rolodex rolodex=null;
try {
FileInputStream fi=new FileInputStream("rolodata");
ObjectInputStream serial=new ObjectInputStream(fi);
rolodex=(Rolodex)serial.readObject();
rolodex.display();
} catch (Exception ex) {
System.out.println("Ошибка при сериализации объекта");
}
}
}
Класс RoloRead, показанный в листинге 4, прежде всго открывает поток к файлу данных используя класс FileInputStream. Присоединив этот поток к объекту класса ObjectInputStream, мы готовы читать объект, используя метод readObject. Обратите внимание, что объект, который возвращает метод readObject необходимо преобразовать в ваш результатирующий класс - Rolodex - ява не будет делать это за вас автоматически. При вызове метода display полученного объекта класса Rolodex на экране появлятся содержимое этого объекта.
RoloWrite.java и RoloRead.java компилируются обычным образом. Создайте образ объекта запуском RoloWrite, а затем запустите RoloWrite. Вы увидите следующий вывод:
ID: 100 NAME: Lazy Larry ADDR: 123 Easy Drive ID: 101 NAME: Happy Harry ADDR: 30 Sunset Ave ID: 102 NAME: Big Bessie ADDR: 11 Markey Way ID: 103 NAME: Guitar Man ADDR: 461 Ocean Blvd ID: 104 NAME: Java Joe ADDR: 1 Hacker Ave
![[ Java... in Russian!]](JavaInRussian.gif)