객체직렬화(Object Serializing)
객체는 클래스를 통해 팔요한 시기에 생성되며 프로그램이 종료하지 않더라도 소멸된다. 물론 프로그램이 종료하면 사라진다. 실행시간에 유지하고 있던 객체 내부의 정보와 객체 자신의 정보를 어디엔가 기록해 놓고 나중에 필요한 시기에 다시 볼수 있는 방법을 제공하는것이 객체직렬화 이다.
정보를 연속된 바이트 단위로 기록하는데 이를 객체 직렬화라고 한다.
직렬화의 과정은 인스턴스 변수의 값을 저장하는 일인데 만약 인스턴스 변수가 다른 객체를 참조하고 있는 참조형의 변수일 경우 그 변수가 가리키는 객체 또한 직렬화 되어야 한다. 이렇게 직렬화는 복잡한 Tree형태로 계속 진행된다.
(만약 참조형 변수가 가리키는 객체가 Serializable, Externalizable을 구현 하지 않았다면 직렬화가 되지 않으므로 이경우에는 readObject 메소드및 writeObject를 적절히 프로그램 내부에 기록해 줌으로서 제한적이지만 가능한 방법을 제시한다.)
Static 필드, transient로 명시적으로 직렬화 하지 말라고 선언된 변수등은 직렬화 되지 않는다.
직렬화를 담당하는 클래스는 java.io.ObjectInputStream, java.io.ObjectOutputStream
적절히 writeObject, readObejct 메소드를 구현한다.
객체를 생성한후 그 인스턴스를 a.dat 파일에 쓰는 경우
FileOutputStream fos = new FileOutputStream(“”a.dat);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(“MyString…”);
oos.writeObject(new Date());
oos.flush();
복구하는 방법
FileInputStream fis = new FileInputStream(“”a.dat);
ObjectInputStream ois = new ObjectInputStream(fis);
String myString = (String)ois.readObejct();
//return형이 Object이므로 타입캐스팅이 필요
Date d = (Date)ois.readObject();
// MySerializationWrite.java
import java.io.*;
public class MySerializationWrite extends MySuperClass implements Serializable {
int i;
public MySerializationWrite(int i) {
this.i = i;
j=i*2;
}
public static void main(String[] args) throws IOException {
FileOutputStream fos = new FileOutputStream("imsi.dat");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(new MySerializationWrite(2000));
oos.close();
System.out.println("객체 쓰기 완료...");
}
}
class MySuperClass implements Serializable {
int j;
}
객체직렬화(Object Serializing) –예제(복원하기)
import java.io.*;
public class MySerializationRead implements Serializable{
public static void main(String[] args) throws IOException, ClassNotFoundException {
FileInputStream fis = new FileInputStream("imsi.dat");
ObjectInputStream ois = new ObjectInputStream(fis);
MySerializationWrite m = (MySerializationWrite)ois.readObject();
ois.close();
System.out.println("읽은후 MySerializationWrite(i) :" + m.i);
System.out.println("읽은후 MySerializationWrite(j) :" + m.j);
}
}