직렬화(Serialization)
- def: 객체를 데이터 스트림으로 만드는 것. 객체에 저장된 데이터를 스트림에 쓰기(write) 위해 연속적인(serial) 데이터로 변환하는 것을 의미한다. 반대로 스트림으로부터 데이터를 읽어서 객체를 만드는 것은 역직렬화(deserialization)이라고 한다.
- 객체란 클래스에 정의된 인스턴스 변수의 집합이다. 객체에는 클래스변수나 메서드가 포함되지 않는다. 객체는 오직 인스턴스 변수로만 구성되어 있다.
- 그래서 객체를 저장한다는 것은 객체의 모든 인스턴스 변수값을 저장하는 것과 같은 의미이다.
ObjectInputStream, ObjectOutputStream
직렬화에는 ObjectOutputStream을 사용하고 역직렬화에는 ObjectInputStream을 사용한다.
예시
// objectfile.ser이라는 파일에 UserInfo객체를 직렬화해서 저장 FileOutputStream fos = new FileOutputStream("objectfile.ser"); ObjectOutputStream out = new ObjectOutputStream(fos); out.writeObject(new UserInfo()); // 역직렬화 FileInputStream fis = new FileInputStream("objectfile.ser"); ObjectInputStream in = new ObjectInputStream(fis); UserInfo info = (UserInfo)in.readObject(); // Object -> UserInfo 형변환
직렬화 가능한 클래스 만들기
Serializable, transient
java.io.Serializable 인터페이스를 구현하도록 하면 된다. 다만 해당 클래스가 Object객체와 같이 직렬화가 불가능한 객체를 포함하고 있을 수도 있다. 이 때 직렬화를 시도하면 에러가 나는데, 이를 해결하기 위해서는 변수 앞에
transient
를 붙이면 된다.transient
가 붙으면 직렬화 대상에서 제외한다는 의미로, 직렬화가 되지 않거나 의도적으로 제외하고자 하는 변수 앞에 붙이면 된다.