직렬화란?

직렬화란 객체를 데이터 스트림으로 만드는 것이다. 즉 객체에 저장된 데이터를 스트림에 쓰기위해 연속적인 데이터로 변환하는 것을 말한다.
 반대로 스트림으로부터 데이터를 읽어서 객체를 만드는 것을 역직렬화라고 한다.
직렬화되는 객체에 대상에는 메소드는 없다. 객체는 클래스에 정의된 인스턴스변수의 집합이다. 객체에는 클래스변수ㅜ나 메서드가 포함되지 않는다. 객체는 오직 인스턴스 변수들로만 구성되어 있다. 그래서 객체를 저장한다는 것은 바로 객체의 모든 인스턴스변수의 값을 저장하는 것이다.


ObjectInputStream , ObjectOutputStream

직렬화에는 ObjectOutputStream , 역직렬화에는 ObjectInputStream을 사용한다.

직렬화가 가능한 클래스를 만드는 방법.

결론부터 말하면 Serializable 인터페이스를 구현하면 된다. 해당 인터페이스에는 구현할 메소드는 없다. 다만 직렬화 가능/불가능을 구별할 수 있도록 하는 인터페이스이다.  하지만 만약 부모클래스에는 Serializable 인터페이스를 구현하지 않았고 , 자식클래스에서는 인터페이스를 구현했을 때, 자식클래스를 직렬화하면 어떻게 될까? 자식클래스에는 부모클래스의 모든 인스턴스 변수가 있지만, 부모클래스가 Serializable 인터페이스를 구현하지 않았기 때문에 부모 클래스의 인스턴스변수는 직렬화에서 제외된다. ( transient 키워드는 임의로 직렬화대상에서 제외시킬 수 있는 키워드)
 따라서 위와같은 경우에는 writeObject와 readObejct 메소드를 정의하여 부모의 인스턴스변수를 직렬화 대상에 직접 추가해줘야한다. 




직렬화 가능한 클래스 버전관리.

직렬화된 객체를 역직렬화할 때는 직렬화 했을 때와 같은 클래스를 사용해야한다. 그러나 클래스의 이름이 같더라도 클래스으 ㅣ내용이 변경된 경우 역직렬화는 실패한다. 객체가 직렬화될 때 정의도니 멤버들의 정보를 이용해서 serialVersionUID라는 클래스의 버전을 자동생성해서 직렬화 내용에 포함한다.그래서 역직렬화 할 때 클래스의 버전을 비교함으로써 직렬화할 떄의 클래스의 버전과 일치하는지 확인할 수 있는 것이다.


serialVersionUID 의 값은 정수값이면 어떤한 값으로도 지정할 수 있지만 서로 다른 클래스간에 같은 값을 갖지 않도록 serialver.exe 를 사용해서 생성하는 것이 보통이다.

+ Recent posts