[C#] 직렬화와 역직렬화란?

Arthur·2023년 8월 20일
0
post-thumbnail

공부하게된 계기


웹 개발을 했을 때는 스프링 프레임워크를 사용했었습니다.
그 때는 Jackson 라이브러리가 있어서 직렬화와 역직렬화를 하는데 큰 도움을 줬습니다.
API서버를 구축할 때 클라이언트에게 Response할 데이터를 객체 형태로 리턴하면 Jackson이 Json 형식으로 직렬화 과정을 처리해줍니다.

하나의 케이스만 보고 개발을 했었어서 그런지 직렬화, 역직렬화는 네트워크 상으로 전송될 때에만 해당 되는 줄 알았습니다.
그런데 이번에 로컬PC에 Json, XML 같은 형식으로 파일로 저장해도 직렬화를 한다는 것을 알게 되었습니다.

아직 직렬화와 역직렬화에 대해 아직 개념이 덜 잡힌 것 같아서 이렇게 다시 정리하게 되었습니다.



직렬화(Serialization)이란?


컴퓨터 과학의 데이터 스토리지 문맥에서 데이터 구조나 오브젝트 상태를 동일하거나 다른 컴퓨터 환경에 저장(이를테면 파일이나 메모리 버퍼에서, 또는 네트워크 연결 링크 간 전송)하고 나중에 재구성할 수 있는 포맷으로 변환하는 과정이다.
오브젝트를 직렬화하는 과정은 오브젝트를 마샬링한다고도 한다. 반대로 일련의 바이트로부터 데이터 구조를 추출하는 일은 역직렬화(Deserialization)이라고 한다.
<위키백과 - 직렬화>

위키백과의 내용을 이해하기 쉽게 한 줄로 요약하면 아래와 같습니다.

직렬화는 객체를 파일의 형태 등으로 저장하거나,
통신하기 쉬운 포맷으로 변환하는 과정을 의미합니다.


Serialization의 'Serial' 은 연쇄. 연속해서 이어지는 어떤 것을 의미합니다.
이런 'Serial' 이라는 단어는 한국어로 직렬이라고 합니다.

직렬화의 대상인 Object는 메모리에 있고 형태가 추상적입니다.
그래서 이런 Object를 string 혹은 바이트(bytes) 형태로 직렬화를 해줍니다.

이렇게 직렬화를 거쳐 일련의 형태를 가진 데이터를 파일로 저장하거나 클라이언트에게 전송할 수 있습니다.



역직렬화(Deserialization)란?


말그대로 직렬화 되어있는 데이터를 역으로 직렬화 하는 것을 의미합니다.

직렬화를 하는 과정에서 Json 형식으로 직렬화 할 지 아니면 Bytes 형식으로 할 지 정했습니다.
반대로 역직렬화를 할 때는 일련의 형식을 가진 데이터를 읽거나 메모리에 쓸 수 있도록 변환하는 것입니다.

이런 직렬화 포맷에는 아래와 같은 형식들이 대표적입니다.

  • Json
  • XML
  • CSV
  • Byte

여기서 Json, XML, CSV는 사람이 읽을 수 있는 형태입니다.
하지만 string 형태로 저장이 되기 때문에 저장 공간의 효율성이 떨어지고, 비교적 파싱하는 시간이 오래 걸린다고 합니다.

반대로 Binary 직렬화는 사람이 읽기 힘든 형태입니다.
하지만 저장 공간을 효율적으로 사용할 수 있고, 비교적 파싱하는 시간이 빠르다고 합니다.



직렬화를 하는 이유


디스크에 저장되어 있는 데이터는 직렬화를 거치면서 파싱이 가능한 유의미한 데이터가 됩니다.

이런 직렬화된 데이터를 특정 대상의 컴퓨터에 전송하면,
해당 포맷에 맞게 파싱을 해서 읽거나 쓰기가 가능합니다.

이런 직렬화 포맷은 특정의 포맷이 성능상 더 좋아서 사용 하는 것이 아닌,
각 산업 분야에 맞춰서 사용하고 있습니다.

예를 들면 실시간 데이터 전송의 성능이 중요한 멀티플레이 RPG 게임은 바이너리 직렬화를 사용합니다.
하지만 웹 개발에서는 대부분 Json 포맷을 사용하고 있습니다.



C#에서의 직렬화와 역직렬화


.NET에서는 직렬화를 할 수 있도록 다양한 방식을 제공합니다.

  • XML Serialization
  • SoapFormatter Serialization
  • Binary Serialization
  • Json Serialization

XML, SoapFromatter, Binary 직렬화는 링크를 참고하시면 예제 코드가 잘 나와있습니다.

Json 직렬화는 Ms Docs 링크를 참고하시면 설명과 함께 코드가 잘 나와있습다.

해당 예제 코드를 정리해서 공유하면 좋겠지만 절대로 귀찮아서 링크만 달아놓은게 아닙니다.


이렇게 C#에서의 직렬화와 역직렬화까지 한번 알아봤습니다.
이미 프로그래밍 언어에서 제공해주는 클래스들이나 라이브러리가 있어서 보다 쉽게 직렬화와 역직렬화를 할 수 있다는 것을 알게되었습니다.



참고 자료


  • hudi.blog - 직렬화(Serialization)와 역직렬화(Deserialization) => 링크
  • 제이온님 블로그 - [Java] 직렬화와 역직렬화 => 링크
  • 자바의 정석 - 직렬화(Serialization) 934p
  • 직렬화와 역직렬화 (Serialization & Deserialization) => 링크
  • csharpstudy.conm - .NET Serialization => 링크
profile
기술에 대한 고민과 배운 것을 회고하는 게임 서버 개발자의 블로그입니다.

0개의 댓글