(Java) 객체 직렬화

객체 스트림은 프로그램 메모리 상에 존재하는 객체를 직접 입출력 해 줄 수있는 스트림으로 현재 상태를 보존하기 위한 영속성을 지원할 수 있다.

자바에서 객체 안에 저장되어 있는 내용을 파일로 저장하거나 네트워크를 통ㅎ여 다른곳으로 전송하려면 객체를 바이트 형태로 일일이 분해해야 한다.이를위하여 객체를 직접 입출력 할 수 있도도록 해주는 것이 객체 스트림이다.

1. 객체 전송의 단계

객체를 분해하여 전송하기 위해서는 직렬화(Serialization) 되어야 한다.

객체를 전송하기 위해서는 3가지 단계를 거친다.

(1) 직렬화된 객체를 바이트 단위로 분해한다. (marshalling)
(2) 직렬화 되어 분해된 데이터를 순서에 따라 전송한다.
(3) 전송 받은 데이터를 원래대로 복구한다. (unmarshalling)


2. 마샬링 (marshalling)

마샬링(marshalling)은 데이터를 바이트의 덩어리로 만들어 스트림에 보낼 수 있는 형태로 바꾸는 변환 작업을 뜻한다.
자바에서 마샬링을 적용할 수 있는 데이터는 원시 자료형(boolean, char, byte, short, int, long, float, double)와 객체 중에서 Serializable 인터페이스를 구현한 클래스로 만들어진 객체이다.

객체는 원시 자료형과 달리 일정한 크기를 가지지 않고 객체 내부의 멤버 변수가 다르기 때문에 크기가 천차만별로 달라진다. 이런 문제점을 처리할 수 있는게 ObjectOutputStream 클래스이다.


3. 직렬화 (Serializable)

마샬링으로 바이트로 분해된 객체는 스트림을 통해서 나갈 수 있는 준비가 되었다. 앞에서 언급한대로 객체를 마샬링하기 위해서는 Serializable 인터페이스를 구현한 클래스로 만들어진 객체에 한해서만 마샬링이 진행될 수 있다.

Serializable 인터페이스는 아무런 메소드가 없고 단순히 자바 버추얼 머신에게 정보를 전달하는 의미만을 가진다.

* 직렬화가 가능한 객체의 조건

(1) 기본형 타입(boolean, char, byte, short, int, long, float, double)은 직렬화가 가능
(2) Serializable 인터페이스를 구현한 객체여야 한다. (Vector 클래스는 Serializable 인터페이스구현)
(3) 해당 객체의 멤버들 중에 Serializable 인터페이스가 구현되지 않은게 존재하면 안된다.
(4) transient 가 사용된 멤버는 전송되지 않는다. (보안 변수 : null 전송)

4. 언마샬링 (unmarshalling)

언마샬링은 객체 스트림을 통해서 전달된 바이트 덩어리를 원래의 객체로 복구하는 작업이다. 이 작업을 제대로 수행하기 위해서는 반드시 어떤 객체 형태로 복구할지 형 변환을 정확하게 해주어야 한다.

Vector v = (Vector)ois.readObject(); 
// OutputInputStream의 객체를 읽어서 Vector 형으로 형변환 한다.

이때 ObjectInputStream을 사용하여 데이터를 복구한다.






댓글

이 블로그의 인기 게시물

(네트워크)폴링방식 vs 롱 폴링방식

(ElasticSearch) 결과에서 순서 정렬

(18장) WebSocekt과 STOMP를 사용하여 메시징하기