
오늘은 직렬화/역직렬화에 대해서 알아보려 한다.

데이터 구조나 오브젝트 상태를 동일하거나 다른 컴퓨터 환경에 저장(이를테면 파일이나 메모리 버퍼: persistence)하고 나중에 재구성할 수 있는 포맷으로 변환하는 과정
쉽게 생각하면, 내가 가지고 있는 이 객체 구조를 어딘가에 저장할 수 있도록 변환하는 과정을 말한다. 일단 이 질문으로부터 출발해야 한다.
내가 구성한 객체 상태 그대로를 다른 사람에게 전달할 수 없을까?
이러한 질문에 대한 해결방법으로 나온 것이 직렬화이다. 이를 통해서 객체의 상태를 저장(Serialization)하고 특정 위치에 해당 객체를 다시 만들 수 있다.(Deserialization)  swift에는 객체 그래프를 archiving을 통해 저장해 둔 뒤 이를 불러올 수 있는 방법이 있다. NSKeyedArchiver라는 친구인데, 이건 나중에 다뤄보도록 하겠다. 지금은 개념만 알아보자. 다음에 Persistence 전체에 대해 한번 알아보도록 하겠다.
형식 데이터(Int, Char, Float)는 통신이 가능하나, 객체는 불가하기 때문.
객체 인스턴스는 결국 힙 영역에 할당되어 있고, 스택에서 이 힙 메모리를 참조하는 구조로 되어 있다. 그럼 이 인스턴스 자체를 복사해서 넘겨주고 싶을 때, 이 메모리의 주소를 넘겨줄 것인가? 만약 값타입 (Int, Char, Float)의 경우에는 값을 전달하면 되기 때문에 문제가 없다. 하지만 객체의 경우에는 특정 메모리 주소 자체가 아무런 의미도 가지지 못한다. 말 그대로 인스턴스의 구조자체를 넘겨받아야 의미가 있다.
이러한 점에서 직렬화는 참조 형식 데이터를 값 형식 데이터로 변환해주어, 서로 통신이 가능한 구조로 변환한다.
| csv, json, xml | binary | |
|---|---|---|
| 장점 | - 사람이 읽을 수 있는 형태  - 최근 많이 사용  | - 저장 공간 효율적으로 사용 가능  - 파싱 시간 빠름(데이터 양 많을 때 사용) - i.e: Protocol Buffer, Apache Avro  | 
| 단점 | - 파싱 시간 오래 걸림(데이터 적을때 사용)  - 저장 공간 효율성 떨어짐  | - 사람이 읽을 수 없음 | 
하다보니, 개념은 굉장히 간단해서 할 얘기가 없었다. 이를 기반으로 추후 Swift에서 사용하는 Persistence에 대해 정리할 예정이다. 끝!
틀린 정보나 궁금한 점이 있다면 언제든 Twitter로 연락주세요! 감사합니다.