삽질의 현장/- ETC

[삽잡이] 직렬화 (Serialization ) & 역직렬화 (UnSerialization)

shovelman 2015. 11. 12. 08:57


직렬화란, 말 그대로 직렬로 만들겠다는 뜻이다.

그렇다면 역직렬화란? 이또한 역직렬로 만들겠다는 뜻이다.


사실 직렬화라는 단어는 '객체'에 대한 내용이 나오지 않는다면 의미가 없습니다.

객체를 어떤 장치에 쓰고, 다시 객체로 복원하는지에 대한 작업이 

직렬화와 역직렬화에 관련된 작업이 됩니다.


우리가 만든 객체가 하나 있다고 해봅시다.

이때에 이 객체를 똑같이 복원하고 싶을 때 어떻게 할까요?

객체는 어플리케이션에 만들어지는데, 

프로그램이 죽는 순간 다 날라가버리지 않습니까?


마치 피x온라인에서 전설의 카드로 '베르캄프'선수를 뽑았는데,

피x온라인을 종료하자마자 베르캄프가 날라간다고 해봅시다... 하...


이처럼, 어플리케이션을 다시 켰을 때 

지금까지 만들어놓은 객체를 복원되게 하고싶다면?

이러한 요구로부터 나온 단어가 바로 '직렬화'입니다.


객체지향적인 부분이 아니라면, 직렬화라는 개념이 나오지 않습니다.

왜냐하면, 직렬화는 객체와 관련된 것이기 때문입니다.


기본적인 개념은,

이 객체를 어떤 객체를 보관할 수 있는 저장장치에 쓰고,

다시 역직렬화 즉, 다시 복원하는 작업을 수행하는 것입니다.


객체라는 것은 상태와 기능으로 이뤄져있습니다.

그러면, 기록할 때는 뭘 기록할까요?

당연히 상태겠지요.. 기능은 상태가 아니지 않습니까?


그런데, 아무렇게나 저장을 한다면 복원을 할 수 없습니다.

직렬화를 사용하는 이유가 저장장치에 객체를 보관했다가 

다시 복원하려고 만든 개념이지 않습니까.... 


Format을 만든다면, 복원이 가능합니다.

포멧은 읽을 때 필요한 것 아니겠습니까?

복원이 안되면 저장의 의미가 없기 때문에,

따라서 포멧이 필요한 것이고, 포멧을 보고 객체를 복원할 수 있습니다.

그래서 포멧이 있어야되는것이지요...


우리만의 약속으로 몇 바이트까지는 헤더,

몇 바이트까지는 크기, 몇 바이트부터는 내용...

이런식으로 파일을 저장해서 복원할 수 있습니다.


그런데 뭐 일일히 이렇게 다 직접해줍니까...
아무튼.. 이렇게 직접 포멧을 만들어 사용하게 되면
선형 배열이 되는것입니다.
이를 바이트 배열이라고 부르지요.
그런데 이렇게 하기에는 사용자 입장에서 힘듭니다.

직렬화라는 개념은 기본적으로 '자동화'가 들어갑니다.
직접 포멧을 만들고 저장하고 복원을 하지 않아도
객체를 직렬화 하라고 하면, 저장장치에 쓰는것이고,
역직렬화하면 다시 복원이 되는 것입니다.

그래서 기본적으로 직렬화를 정의하라고 하면,
객체를 어떤 저장장치에 바이트 배열로 보관하는 작업이라고 할 수 있고
역직렬화는 이 개념의 역이라고 볼 수 있죠.
즉, 저장장치에 보관되어있던 객체의 상태 정보인 바이트 배열을 
다시 객체로 복원하는 작업이라는 말입니다.

그래서 객체라는 단어가 나오지 않는다면,
직렬화라는 용어를 일반적으로 쓸 수 없는 것입니다.

객체를 바이트 배열로 어떤 장치에 보관하는 것을 '직렬화'
그 바이트 배열에 보관되어 있던 데이터..
즉, 객체의 상태정보들을 다시 읽어서 객체로 복원하는 것을 '역직렬화'라고 부른다는 것입니다.