본문 바로가기

자바의 정석

[자바의 정석 2권] 직렬화(Serialization)

1) 직렬화란?

- 직렬화(serialization)란 객체를 데이터 스트림으로 만드는 것을 뜻한다.

  다시 얘기하면 객체에 저장된 데이터를 스트림에 쓰기(write)위해 연속적인(serial) 데이터로 변환하는 것을 말한다.

  반대로 스트림으로부터 데이터를 읽어서 객체를 만드는 것을 역직렬화(deserialization)이라고 한다. 

 

- 객체를 저장한다는 것은 바로 객체의 모든 인스턴스 변수의 값을 저장한다는 것과 같은 의미다.

  어떤 개체를 저장하고자 한다면, 현재 겍체의 모든 인스턴스 변수의 값을 저장하기만 하면 된다.

  그리고 저장했던 객체를 다시 생성하려면, 객체를 생성한 후에 저장했던 값을 읽어서

  생성한 객체의 인스턴스 변수에 저장하면 된다.

 

2) ObjectInputStream, ObjectOutputStream

- 직렬화(스트림에 객체를 출력)에는 ObjectOutputStream을 사용하고,

  역직렬화(스트림으로부터 객체를 입력)에는 ObjectInputStream을 사용한다.

  

- ObjectInputStream과 ObjectOutputStream은 각각 InputStream, OutputStream을 직접 상속받지만

  기반스트림을 필요로 하는 보조스트림이다. 

  그래서 객체를 생성할 때 입출력(직렬화/역직렬화)할 스트림을 지정해주어야 한다.

ObjectInputStream(InputStream in)
ObjectOutputStream(OutputStream out)

 

- 먼저 파일에 객체를 저장(직렬화)하고 싶다면 다음과 같이 하면 된다 

FileOutputStream fod = new FileOutputStream("objectfile.ser");
ObjectOutputStream out = new ObjectOutputStream(fos);

out.writeObject(new UserInfo());

 

- ObjectOutputStream의 writeObject(Object obf)를 사용해서 객체를 출력하면,

  객체가 파일에 직렬화되어 저장된다.

 

- 역직렬화 방법 역시 간단하다. 직렬화할 때와는 달리 입력스트림을 사용하고,  

  writeObject(Object obf)대신 readObject()를 사용하여 저장된 데이터를 읽기만 하면 

  객체로 역직렬화된다.

 

- 다만, readObject()의 반환타입이 Object이기 때문에 객체 원래의 타입으로 형변환 해주어야 한다. 

FileInputStream fis = new FileInputStream("objectfile.ser");
ObjectInputStream in = new ObjectInputStream(fis);
UserInfo info = (UserInfo) in.readObject();