Чтобы сериализовать объект, требуется создать выходной поток OutputStream, который нужно вложить объект ObjectOutputStream. По сути, вызов метода writeObject() осуществляет сериализацию объекта, и далее вы пересылаете его в выходной поток данных OutputStream. Для восстановления объекта необходимо надстроить объект ObjectInputStream для входного потока InputStream, а затем вызвать метод readObject(). Этот метод возвращает ссылку на объект типа Object, поэтому после вызова метода следует провести нисходящее преобразование для получения объекта нужного типа.
Давайте рассмотрим пример сериализации:
import java.io.*;
class A implements Serializable{
private static int n=0;
private int i;
A(int i){
this.i=i;
n=i;
}
public String toString(){
return i+" "+n;
}
}
public class Temp{
public static void main(String []args) throws IOException,ClassNotFoundException {
A a = new A(5);
System.out.println(a);
String path = "serial.dat";
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(path));
oos.writeObject(a);
a = new A(10);
System.out.println(a);
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(path));
a = (A)ois.readObject();
System.out.println(a);
}
}
Вывод этой программы будет следующий:5 5
10 10
5 10
Итак, мы сериализовали объект со значением поля i=5 и значением статического поля n=5, создали новый объект(i=10,n=10), и десериализовали записанный объект. Как видим, обычное поле успешно десериализовалось, а вот статическое осталось без изменений. Если вам нужно сериализовать статические поля, вы должны делать это вручную. Исправим нашу предыдущую программу так, чтобы она сохраняла статическую переменную:
import java.io.*;
class A implements Serializable{
private static int n=0;
private int i;
A(int i){
this.i=i;
n=i;
}
public String toString(){
return i+" "+n;
}
public static void serializeStatic(ObjectOutputStream oos) throws IOException{
oos.writeInt(n);
}
public static void deserializeStatic(ObjectInputStream ois) throws IOException{
n=ois.readInt();
}
}
public class Temp{
public static void main(String []args) throws IOException,ClassNotFoundException {
A a = new A(5);
System.out.println(a);
String path = "serial.dat";
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(path));
A.serializeStatic(oos);
oos.writeObject(a);
a = new A(10);
System.out.println(a);
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(path));
A.deserializeStatic(ois);
a = (A)ois.readObject();
System.out.println(a);
}
}
Вывод:5 5
10 10
5 5
Как видите, теперь все в порядке. Мы просто добавили и вызвали два статических метода: для сериализации и десериализации статической переменной.
Всего хорошего!
Комментариев нет:
Отправить комментарий
Примечание. Отправлять комментарии могут только участники этого блога.