Microsoft MVP성태의 닷넷 이야기
마샬링 정의 및 목적이 궁금합니다. [링크 복사], [링크+제목 복사]
조회: 4496
글쓴 사람
한예지 donator
홈페이지
첨부 파일
 

선생님 안녕하세요.
선생님 글들을 보았을 때 마샬링을 하는 경우가 크게 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]


비밀번호

댓글 작성자
 



2023-10-04 01시23분
[답변 1, 2] 부끄럽지만 저도 ^^; 마샬링과 직렬화의 차이를 학술적으로 알고 있지는 않습니다. 개인적으로는, 우리의 직업을 "소프트웨어 개발자"라고 해야 할지, "소프트웨어 엔지니어"라고 해야 할지에 대한 차이와 비슷하다고 봅니다.

그래서 보통은 해당 용어를 사용하는 기술과 관련해 처음 문서를 접했을 때 봤던 용어를 그대로 관습적으로 사용하게 되는데, 가령 Win32 메시지를 전송할 때나 RPC 함수를 호출할 때는 인자를 마샬링한다고 표현하고, 파일이나 네트워크로 전송하기 위해 바이트 배열에 담을 때는 직렬화라고 쓰게 됩니다.

또한, 언급하신 "Managed Memory"에서 "Unmanaged Memory"로 옮길 때도 (역시 마이크로소프트의 문서에서 보게 된 기억으로) 마샬링이라는 단어를 쓰게 됩니다.

직렬화가 마샬링의 한 수단일 수 있다는 것에는 동의합니다. 가령, 아래의 객체를 "직렬화"한다고 하면,

    record class Person(int age, string name);
    Person my = new (5, "Tester");

보통은 5와 "Tester"라는 문자열을 그대로 보관하는 것을 가정하겠지만, 마샬링한다고 하면 상황에 따라 달라질 수 있습니다. 즉, InProcess 내에서 마샬링한다고 하면 그냥 참조 값을 전달할 것이고, OutOfProcess로 마샬링한다고 하면 직렬화에 준하는 방식으로 값을 전달하는 식으로 바뀔 수 있습니다.

그런데, "Codebase"를 같이 직렬화한다는 것은 다소 어색한 것 같습니다. 위의 사례에서 예로 든 Win32 메시지나 RPC 함수에서의 마샬링에서 Codebase 정보를 함께 전송하지는 않기 때문입니다. 찾아보니까 그에 대한 언급이 있던데,

What is the difference between Serialization and Marshaling?
; https://stackoverflow.com/questions/770474/what-is-the-difference-between-serialization-and-marshaling

저 질문의 답변자가 "Marshalling Object is serialized(member data is serialized) + Codebase is attached"라고 제약을 둔 것이 저도 잘 이해는 안 됩니다. 왜냐하면 실 사용예를 보면, 닷넷의 Binary Serialization과 같은 경우 직렬화한 데이터 내에 codebase 정보도 함께 넣기 때문에 이것을 반드시 마샬링의 영역이라기보다는 "필요 유무"에 따른 부가 정보라고 봐야할 것 같습니다. (참고로, 자바의 Log4j에 있었던 보안 결함도 직렬화에 포함된 codebase 정보가 연관된 것입니다.)

[답변 3] 스레드가 달라지면 마샬링을 하는 것은 상황에 따라 필요 유무가 달라질 수 있습니다. 해당 이야기에 대한 문맥 정보가 있다면 답변이 더 수월할 것 같지만, 일단 예전의 ActiveX/COM 개체를 예로 들면, 스레드가 다른 경우 STA COM 개체를 마샬링해 다른 스레드에 전달한 후 언마샬링해 써야 한다는 규칙이 있습니다.
정성태
2023-10-04 10시20분
스레드가 달라지면 마샬링을 하는 게시글은
https://www.sysnet.pe.kr/2/0/11679 에서 참고했습니다.

"우선, C# COM 객체는 기본적으로 COM Apartment 유형이 MTA입니다.
 이 때문에 STA에서 MTA COM 객체를 활성화한 경우 스레드가 달라지면 마샬링을 하게 됩니다.
 이때의 마샬링이란 콜백 이벤트의 호출을 직렬화하기 위해 Win32 이벤트를 사용한다는 것입니다."

그리고 선생님의 답변을 보고 다른 곳에서도 그런 글이 있는지 찾아보았습니다.
스레드가 달라지면 마샬링을 할 수"도" 있다는 냄새(?)를 풍기는 문장이 있습니다.

"윈폼 (WinForms)에는 System.Windows.Forms.Timer라는 클래스가 있으며,
이들 타이머 클래스들은 Tick 이벤트 핸들러를 실행하기 위해 별도의 작업쓰레드를 생성하지 않고
UI 쓰레드에서 실행하기 때문에,
UI 컨트롤이나 UI Element들을 직접 이벤트 핸들러 안에서 마샬링 없이 엑세스할 수 있다."
[출처] https://www.csharpstudy.com/Threads/timer.aspx

위의 글을 보면 만약 작업스레드를 생성해서 실행하는 경우
마샬링을 하면 UI 컨트롤이나 UI Element들을 접근할 수 있다고 해석할 수"도" 있습니다.

서로 다른 프로세스도 아니고 같은 솔루션 파일 안에서 스레드만 다를 뿐인데
왜 직렬화를 해야 되는지 이해가 되지 않습니다.
저는 같은 솔루션 파일 안이면 당연히 Managed Memory, Unmanaged Memory도 상관없고
같은 솔루션에 있는 스레드'들'이라면 데이터 타입도 동일하게 맞출 수 있을 텐데
굳이 마샬링을 해야 되나 싶습니다...
한예지
2023-10-05 12시18분
11679 글은 COM 개체이기 때문에 그런 것입니다.

인용하신 csharpstudy 글의 "마샬링"의 경우에는 데이터가 아닌 (어찌보면 마찬가지로 데이터에 불과한) 코드를 마샬링한다고 보면 되겠습니다. 즉, 실행해야 할 코드의 주소를 현재 스레드에서 실행하지 않고 다른 스레드에서 실행할 수 있도록 Control.Invoke 또는 Control.BeginInvoke를 통해 마샬링시켜서 전달하는 것입니다. (실제로는 코드 주소 그대로 전달되겠지만 대상 스레드가 실행하도록 부가 처리가 되는 정도입니다.)

"위의 글을 보면 만약 작업스레드를 생성해서 실행하는 경우 마샬링을 하면 UI 컨트롤이나 UI Element들을 접근할 수 있다고 해석할 수도 있다"고 언급하셨는데, 실제로 접근할 수 있게 돼 있습니다. 그 예제를 아래의 글에서 다루고 있습니다.

UI 요소의 접근은 반드시 그 UI를 만든 스레드에서!
; https://www.sysnet.pe.kr/2/0/11561

UI 요소의 접근은 반드시 그 UI를 만든 스레드에서! - 두 번째 이야기
; https://www.sysnet.pe.kr/2/0/12537

다시 반복이 되는 듯합니다. 그러니까 결국 11561, 12537 글에 대해서 잘 이해가 안 된다는 것인가요?

(개인적으로는, Invoke/BeginInvoke 호출에 전달하는 것을 마샬링이라는 어려운 용어로 표현하지는 않고, "UI 접근 코드를 태워서 실행"한다는 식으로 표현합니다: "https://www.sysnet.pe.kr/2/0/11071#run_async")
정성태
2023-10-05 09시09분
11561, 12537 글을 선생님이 어떤 목적을 가지고 작성하셨는지는 이해하고 있습니다.
  
이번 주 금, 토, 일에 도서관 가서 다양한 책을 읽어본 후에 선생님 답변 다시 한번 읽어보도록 하겠습니다^^

답변 감사드립니다!
한예지
2023-10-05 11시28분
개발 관련 용어들 중에서 보면 한글화가 딱히 어려운 것들이 있는 듯합니다. Marshal이 그렇고, 제 경험으로는 Bind도 "묶는다"라는 식으로 억지 번역을 할 수 있겠지만 대개의 경우에는 그냥 '바인드'라고 쓰는 것이 더 좋았습니다. 예를 들어, 소켓을 지정한 IP/Port에 바인딩한다고 하면 자연스러운데, 묶는다... 또는 엮는다라고 하면 왠지 ^^; 감이 살지 않습니다.

그래도 결국 나중에는 바인딩의 문맥상 의미를 알게 되는 것처럼, 마샬링도 유사할 거라 봅니다. 오죽했으면 그 stackoverflow의 질문처럼 외국인들도 Q&A를 할 정도이니 한국인이 어려워하는 것은 당연한 듯합니다. 너무 조급하게 생각하지 마시고 현재의 쓰임 용도만 숙지한 체로 자연스러운 시간과 경력의 흐름에 맡기는 것도 좋겠습니다.
정성태

1  2  3  4  5  6  7  8  9  10  11  [12]  13  14  15  ...
NoWriterDateCnt.TitleFile(s)
5648주니어개...4/13/20223863컴파일된 코드를 원시코드로 바꾸려면 어떻게해야하나요? [1]파일 다운로드1
5647장성욱4/7/20223906코어지정 CPU사용률 관련 질문 [1]
5646서형주4/6/20223923List에 여러개의 class 객체를 만들어 넣을때, 객체의 method들도 같이 생성되어 메모리를 차지하나요? [1]
5645김인태4/6/20223569윈도우즈 서버의 AD 계정 생성 조건이 있을까요? [1]
5644ㅇㅇ4/6/20224329c# 프로그램을 이용하여 리눅스상에 파일 생성이 가능한가요? [1]
5643유필재4/5/20224197TCP클라이언트 연결 및 통신관련하여 문의드려요 [1]
5642차가워4/4/20224445UdpClient 패킷 수신 문의 [4]
5641장성욱4/4/20224854코어 할당 및 cpu 부하테스트 질문 [7]
5640icoo...4/4/20224397웹가든에서 메모리 동적 업데이트 방법 [1]
5639차가워4/4/20224292c++ 서버 c# 클라이언트 호환 문의 [1]
5638초급4/3/20224590c# sql server 연동 [1]
5637따봉이4/1/20224855Winform Form Load 후 자동 캡쳐관련 [1]파일 다운로드1
5636김철순3/31/20224842WPF에서 Richtext의 View 문의 [5]
5635guest3/30/20224866안정적인 pinning이 가능하네요. [3]파일 다운로드1
5633꿀주세요3/30/20224513선생님 마우스 클릭이벤트 질문이 있습니다. [4]
5632김현수3/30/20224843Remote Desktop으로 접속시 WPF UI 가 다시 그려지는 이벤트를 막을 수 없을까요? [3]
5631김기헌3/24/20224473WPF 컨트롤의 그래픽 처리관련 질문드립니다 [2]파일 다운로드1
5630장성욱3/24/20224300로깅관련 질문입니다. [2]
5629감사합니...3/23/20224557함수에서 예외가 발생하면 try ~ catch처리기를 찾을 때 까지 상위 함수로 계속 올라가나요? [2]
5628홍길동3/23/20225197질문드립니다. [2]파일 다운로드1
5626연준혁3/21/20224428안녕하세요. [3]
5625jaew...3/18/20225361c# 8.0 도서를 구입한 사람입니다. [1]
5624초보자3/17/20224328람다 캡처 관련 문의 [2]
5623한예지 donator3/15/20224700인터프리터 원리가 궁금합니다. [4]
5622김민아3/8/20224636const와 readonly의 명확한 차이가 이게 맞나요? [2]
5621장성욱3/8/20224444c# 로그 관련 질문 [1]
1  2  3  4  5  6  7  8  9  10  11  [12]  13  14  15  ...