직렬화와 마샬링

정제훈·2023년 7월 31일
0
post-thumbnail

직렬화란?

It lets you take an object or group of objects, put them on a disk or send them through a wire or wireless transport mechanism, then later, perhaps on another computer, reverse the process: resurrect the original object(s). The basic mechanisms are to flatten object(s) into a one-dimensional stream of bits, and to turn that stream of bits back into the original object(s).

  • 직렬화(Serialize): 객체를 디스크에 저장하거나 네트워크를 통해 다른 컴퓨터로 전달하기 위해 비트 스트림으로 변환하는 과정
  • 역직렬화(Deserialize): 직렬화된 비트 스트림을 다시 기존 객체로 변환하는 과정

마샬링이란?

  • 마샬링(Marshalling): 직렬화와 유사하게 객체를 다른 데이터 형식으로 변환하는 과정
  • 언마샬링(Unmarshalling, Demarshalling): 역직렬화와 유사하게 마샬링된 데이터를 기존 객체로 복구하는 과정

자바 계열 RFC-2713에 따르면,

To "marshal" an object means to record its state and codebase(s) in such a way that when the marshalled object is "unmarshalled," a copy of the original object is obtained, possibly by automatically loading the class definitions of the object.

자바에서 마샬링은 객체의 상태를 포함해 원격 실행하고자 하는 오브젝트 코드의 URL까지 포함해 변환하는 것을 의미합니다.

이처럼 특정 로직을 수행하는 코드를 타 컴퓨터에서 원격으로 실행시키고자 할 때(이를 Remote Procedure Call이라고 함)에 마샬링을 사용할 수 있습니다.

마샬링은 주로 프로세스나 스레드 간 데이터 교환하거나 로직 수행을 요청해야할 때 사용합니다.


직렬화 vs 마샬링

  • 대체로 직렬화와 마샬링은 비슷한 개념
  • 자바를 기준으로 직렬화는 객체의 상태만을 저장하지만, 마샬링은 실행하고자 하는 코드 URL까지 포함
  • 직렬화는 객체를 비트 스트림으로 변환하는 개념으로 통칭하지만, 마샬링은 메모리 상의 객체를 다른 형태로 변환하는 더 넓은 개념을 의미

직렬화 종류

JSON

  • 자바스크립트 개발에 참여한 더클라스 크록퍼드(Douglas Crockford)가 규정한 자바스크립트 문법에 맞게 데이터를 인간이 읽을 수 있는 텍스트로 표현하는 방식
  • 키-값 쌍의 형태로 객체나 배열을 표현
  • 프로그래밍 언어나 플랫폼에 독립적이라 사용이 편리

예제) 한 사람에 관한 정보를 갖는 객체

{
	"이름": "홍길동",
	"나이": 55,
	"성별": "남",
	"주소": "서울특별시 양천구 목동",
	"특기": ["검술", "코딩"],
	"가족관계": {"#": 2,"아버지": "홍판서","어머니": "춘섬"},
	"회사": "경기 수원시 팔달구 우만동"
}
  • 문자열을 기반으로 한 JSON을 이진 형태로 표현해 전체 용량을 줄인 BSON
  • 라이브러리 종류
    • gson - Google이 만든 Java JSON 직렬화 라이브러리
    • fastjson2 - 빠르게 최적화된 JSON 라이브러리
    • JSON for Modern C++ - 대중적인 C++ JSON 라이브러리
    • RapidJSON - 매우 빠른 C++ JSON 라이브러리

YAML

  • YAML Ain’t Markup Language, Yet Another Markup Language
  • JSON에서 다음 문제를 해결한 Superset
    • 주석 불가능
    • 모든 키, 값, 문자열에 쌍따옴표 강제로 붙여야함
    • 모든 프로퍼티가 쉼표로 구분됨

예제) 한 사람에 관한 정보를 갖는 객체

name: John Smith
age: 33
friends:
   - Mary Smith
   - Susan Williams

Google Protocol Buffers(Protobuf)

  • 위 두 가지 직렬화 방식은 인간이 읽고, 쓰기 쉽게 만들어졌으나, Protobuf는 효율과 안전을 최우선적으로 설계된 직렬화 방식
  • .proto 파일에 직렬화하고자 하는 데이터의 형식을 스키마 형태로 작성하면 소스 코드를 생성
  • 초기에는 C++를 기반으로 만들어졌었으나, 지금은 C#, 파이썬 등 다양한 언어에서 코드 생성기 제공
  • 이진 형태로 인코딩해 메모리 효율이 뛰어남

예제)

syntax = "proto2";

message messagePoint {
	required int32 x = 1;
	required int32 y = 2;
	optional string label = 3;
}

message messageLine {
	required Point start = 1;
	required Point end = 2;
	optional string label = 3;
}

message messagePolyline {
	repeated Point point = 1;
	optional string label = 2;
}

참고 자료

profile
안녕하세요, 프로그래머 정제훈입니다!

1개의 댓글

comment-user-thumbnail
2023년 7월 31일

많은 도움이 되었습니다, 감사합니다.

답글 달기