본문 바로가기

C#

마샬링(Marshalling) vs 직렬화(Serialization)

728x90

직렬화

객체의 상태를 저장하기 위해서 객체를 Byte stream으로 변환하는 것을 의미한다.

즉, 객체에 저장된 데이터를 stream에 쓰기 위해서 연속적인(serial) 데이터로 변환하는 것이라 보면 된다. 이는 데이터를 파일로 저장하거나 memory buffer 또는 Network를 통해 데이터를 송/수신 할 때 용이하게 한다.

마샬링

객체의 메모리 구조를 저장이나 전송을 위해 적당한 자료형태(ex. xml)로 변형하는 것을 의미한다.

보통 서로 다른 컴퓨터 혹은 서로 다른 프로그램 간에 데이터가 이동되어야 할 경우에 사용된다. 구체적으로 말하자면 managed data 형을 unmanaged data 형으로 변환시키는 과정이라 할 수 있다.

여기서 중요한 것은 managed data 와 unmanaged data 단어이다. 즉, 한 환경에서 다뤄진 data 타입을 또 다른 환경에서 이용할 수 없다는 것이다.

예를 들면, function setWindowtext()를 보자. 이 함수는 LPCTSTR(LPCSTR = long pointer constant t_string = const tchar * ) 을 다루지만 System.String을 사용하지 않는 함수이다. 또한 이 함수의 반환값은 BOOL이라는 타입으로 변환 성공여부를 반환한다. 하지만 C#은 BOOL이 아닌 System.Boolean타입을 가지고 있기 때문에 이 함수를 사용할 수 없다.

다른 환경에서도 사용하기 위해서는 data type format을 변경하기 보다는 타입명만 바꿔주면 해결이 된다.

예를 들어,

System.String str = “Hello”;

이 부분을 System.Char의 array로 표현하면

System.Char[] ch = str.ToCharArray();

다음과 같이 나타낼 수 있을것이다.

이 두개의 data는 다르다고 할 수 있을까?

답은 아니다.

둘다 같은 data 를 다루고 있고 str와 ch 변수 둘다 같은 방식으로 담기게 된다. C#에서는 System.Int32 은 Window API는 INT를 가지고있으므로 System.Int32에서 INT로 정렬하려고 한다면 data type 만 변경하면 해결될 수 있다. (내용을 가공하거나 다른 형식으로 복사하여 변형시키는 등으로 해결하지 않아도 된다.)


마샬링은 직렬화랑 비슷한 개념이다. 직렬화와 다른 점이라면 직렬화는 'byte stream으로 변환'하는 것이지만, 마샬링은 '변환하는 일련의 과정'을 뜻한다. 그러므로 마샬링이 좀 더 큰 개념이다.

직렬화의 과정에 마샬링이 포함이 되며, 실제로 객체 전송은 아래와 같은 순서로 진행된다. 그래서 직렬화를 마샬링이라고 해도 무방하다.

1. 직렬화된 객체를 바이트 단위로 분해한다. (marshalling)

2. 직렬화 되어 분해된 데이터를 순서에 따라 전송한다.

3. 전송 받은 데이터를 원래대로 복구한다. (unmarshalling)

직렬화와의 가장 큰 차이점은 직렬화는 객체가 대상이지만 마샬링은 변환자체에 목적이 있기 때문에, 대상과 변환활 오브젝트가 한정되지 않는다. 그렇기 때문에 서로 다른 언어간의 데이터 전송은 직렬화라고 하지 않고 마샬링이라고 한다.

결론

직렬화는 구조화된 객체를 가져와 복사하여 byte stream으로 변환하는 것으로 주로 네트워크 간의 데이터를 주고 받을 때 유용하며, 마샬링은 데이터 코드 베이스를 기반으로 가져와 만드는 것이라고 보면 될 것 같다. 그래서 주로 마샬링은 다른 언어 혹은 다른 플랫폼에서 서로 데이터를 주고 받을 때 사용한다.


직렬화는 객체 전송을 위해서 byte stream으로 변환하는 것이고, 마샬링은 다른 언어 혹은 다른 플랫폼에서 서로 데이터를 주고 받을 때 쓰는 용어인 것 같다.

 

[출처]

https://hyesun03.github.io/2019/09/08/marshalling-vs-serialization/

https://medium.com/@nicegirl/marshalling-vs-serialized-252caf70ba9b

728x90

'C#' 카테고리의 다른 글

비동기 프로그래밍  (0) 2023.11.04
32bit DLL을 64bit .Net 프로그램에서 호출하기  (0) 2023.11.04
마샬링(Marshalling)  (0) 2023.11.04
Delegate와 Event  (0) 2023.11.03
AutoMapper란?  (0) 2023.11.03