네트워크를 공부하기 위해 자료를 조사하던 와중, 직렬화가 자주 언급되는것을 파악하였다. 평소에도 직렬화라는 단어는 많이 들었지만 정확한 의미와 사용하는 이유를 이해하지 못하였기에 이번기회에 확실하게 이해하고자 학습하게 되었다.
직렬화란, 프로그램에서 변수에 저장된 데이터들을 파일에 저장하거나, 또는 통신을 할때 데이터를 통신에 적합한 형태로 변환하는 과정을 직렬화라고 한다.
이에 반대되는 과정으로써 역직렬화(deserialization)이 있다. 이는 직렬화 된 데이터를 프로그램에서 사용할수 있게 변환하는 과정을 말한다.
그렇다면 직렬화를 하는 이유엔 무엇이 있을까?
이를 알아보기전에 데이터가 메모리에 저장되는 방식들을 이해해야 된다.
첫번째로 값 형식 데이터(Value Type)이 있다. 우리가 흔히 쓰는 int, long, float, decimal, enum, 구조체등이 이에 해당되며 이 데이터들은 스택(Stack)에 데이터가 저장된다.
두번째로 참조 형식 데이터(Reference Type)이 있다. string, 배열, 클래스로 만드는 타입등이 해당되며, 이 데이터들은 모두 힙(Heap)에 저장된다.
그러나 이 중 직접적으로 파일등에 데이터를 저장하거나 통신 가능한 데이터는 값 형식 데이터(Value Type)만 가능하다.
참조 형식 데이터(Reference Type)의 경우 간단한 예시를 들어보자.
만약 본인이 아래와 같은 코드를 작성했다고 해보자.
static void Main(string[] args)
{
int[] arr = new int[5] {1,2,3,4,5};
}
우리는 arr에 총 5개의 데이터를 저장하였고, 이는 메모리 곳곳에 아래와 같이 참조된 형태로 저장이 될것이다.
static void Main(string[] args)
{
//표기된 주소는 모두 임의의 주소이다.
int[] arr = new int[5] {
1, // 0x65414441
2, // 0x05604883
3, // 0x156C4FB5
4, // 0x5E9876A1
5 // 0x5259C5DC
};
}
그러나 컴퓨터를 다시 시작하게 되면 해당 메모리 주소에 존재하던 데이터는 모두 사라지게 된다. 그렇기에 동일한 주소로 데이터를 읽어오려고 시도하여도 그 주소엔 엉뚱한 값이 존재할뿐이다.
또한 통신의 경우에도 통신하는 컴퓨터마다 주소에 저장된 값이 다 다르기 때문에 같은 주소값을 전송하여 참조한다한들 또 다시 엉뚱한 데이터를 읽어오게 되는것이다.
이러한 이유로 참조 형식 데이터는 파일에 직접적으로 저장하거나 통신에 사용하는것이 불가능하기때문에 직렬화(Serialization)를 통해 텍스트나 바이너리 형태로 변환하여 저장 및 통신에 사용하게 되는것이다.
https://hub1234.tistory.com/26 by Kim_Jack