선생님 안녕하세요.
선생님 글들을 보았을 때 마샬링을 하는 경우가 크게 2가지로 정리할 수 있더라고요.
* Managed Memory에서 마샬링을 사용해 Unmanaged Memory로 옮길 때
* 스레드가 달라지면 마샬링을 하게 된다.
그래서 마샬링이 무엇인지 궁금해서 정의를 찾아보았습니다.
선생님 책에는 마샬링 정의가 없기 때문에 C++ 최적화[커트 건서로스] 412쪽을 참고했는데
다음과 같이 마샬링을 정의하고 있습니다.
"마샬링은 저장된 데이터를 전송 혹은 다른 매체에 저장 가능한 형태로 변환하는 것을 의미합니다."
읽어보면 직렬화와 비슷한 거 같아서 선생님 책에 직렬화 부분을 다시 읽어보았습니다.
"좁은 의미로 볼 때 일련의 바이트 배열로 변환하는 작업으로 바이트 배열은 직렬화 수단에 불과하다."
"넓은 의미에서 데이터를 어떤 것에 보관하고, 그것으로부터 복원만 할 수 있다면 그 모든 작업을 직렬화/역직렬화라고 정의할 수 있다."
다른 책이나 블로그를 참고해도 직렬화와 마샬링이 비슷하다고 느껴질 뿐 명확히 구분 지을 수 없었습니다.
그럼에도 불구하고 개인적으로 마샬링과 직렬화의 차이점을 추론하면
---------------------------------------------------------------
* 직렬화는 마샬링의 한 부분이다.
프로세스 A의 객체 → (직렬화) → 직렬화된 데이터 → (마샬링) → 직렬화된 데이터 → (역직렬화) → 프로세스 B의 객체
* 마샬링은 코드베이스(원본 소스를 말한다)를 포함하여 객체를 직렬화 한다.
class Student
{
public string Name;
public int ID;
// ...[생략]...
}
Student std = new Student("mijung", 23);
직렬화는 객체의 필드에 저장된 값들을 메모리나 영구 저장 장치에 저장이 가능한
0과 1의 순서로 바꾸는 것이기 때문에 "mijung, 23"이 직렬화 대상이 되는 것이고
마샬링은 "mijung, 23"뿐만이 아니라 코드베이스인
class Student
{ public string Name; public int ID; }도 같이 직렬화하는 것이다.
---------------------------------------------------------------
[질문 ①] 제가 직렬화와 마샬링 차이점을 요약한 것에 틀린 내용이 있을까요?
[질문 ②] 혹여나 제가 정리한 것이 맞더라도 선생님께서 생각하시는 마샬링의 정의와 목적이 궁금합니다.
[질문 ③] 스레드가 달라지면 마샬링을 하는 이유가 궁금합니다.
Managed Memory에서 마샬링을 사용해 Unmanaged Memory로 옮기는 경우라면
동일한 BOOL 타입이라도 C#인 경우와 C++인 경우 바이트가 달라서 마샬링이라는 것을 한다고 생각되는데
스레드가 달라지면 마샬링을 해야 되는 이유는 고민해 봐도 잘 모르겠습니다.
[최초 등록일: ]
[최종 수정일: 10/3/2023]