마샬링(컴퓨터 사이언스)
Marshalling (computer science)컴퓨터 과학에서 마샬링 또는 마샬링(미국식 철자)은 객체의 메모리 표현을 저장 또는 [citation needed]전송에 적합한 데이터 형식으로 변환하는 과정입니다.일반적으로 컴퓨터 프로그램의 서로 다른 부분 간에 또는 한 프로그램에서 다른 프로그램으로 데이터를 이동해야 할 때 사용됩니다.
마샬링은 시리얼라이제이션과 다소 비슷하거나 동의어일 수 있습니다.마샬링은 클라이언트에서 서버로 오브젝트를 전송하는 의도 또는 프로세스를 기술합니다.의도는 실행 중인 프로그램에 존재하는 것과 동일한 오브젝트를 다른 실행 중인 프로그램(즉, 서버로의 전송 및 서버상에 존재하는 클라이언트상의 오브젝트)에 두는 것입니다.직렬화는 데이터를 바이트 스트림으로 변환하는 데만 관심이 있기 때문에 반드시 이러한 의도가 있는 것은 아닙니다.마샬링은 시리얼라이제이션과는 다른 방법으로 행해질 수 있지만 보통 어떤 형태로든 시리얼라이제이션이 사용됩니다.[1]
원시 객체 대신 복합 객체를 사용하여 통신하기 때문에 복잡한 통신을 단순화합니다.마샬링의 역프로세스를 언마샬링(또는 디시리얼라이제이션과 유사)이라고 부릅니다.비마샬링 인터페이스는 시리얼화된 객체를 가져와 내부 데이터 구조로 변환합니다.
마샬링의 정확한 정의는 Python, Java 및 같은 프로그래밍 언어에 따라 다릅니다.NET 및 경우에 따라서는 시리얼라이제이션과 교환하여 사용됩니다.
시리얼화와의 비교
객체를 "직렬화"하는 것은 바이트 스트림이 객체의 복사본으로 다시 변환될 수 있도록 상태를 바이트 스트림으로 변환하는 것을 의미합니다.
"marshal"이라는 용어는 Python 표준[2] 라이브러리에서 내부 Python 개체를 저장하는 특정 유형의 "시리얼라이제이션"에 사용됩니다.
marshal 모듈은 주로 .pyc 파일의 Python 모듈에 대한 "의사 컴파일" 코드 읽기 및 쓰기를 지원하기 위해 존재합니다.
…
Python 개체를 직렬화 및 직렬화 해제하는 경우 대신 피클 모듈을 사용하십시오.
--
Java 관련 정보 RFC 2713, 마샬링은 리모트 호출용 오브젝트를 시리얼화할 때 사용됩니다.마샬링된 객체는 원래 객체의 상태를 기록하고 코드베이스를 포함합니다(여기서 코드베이스는 객체 코드를 로드할 수 있는 URL 목록이며 소스 코드가 아닙니다).따라서 오브젝트 상태와 코드베이스를 변환하기 위해서는 언마셜링을 실행해야 합니다.unmarshaller 인터페이스는 코드베이스를 포함한 마샬링된 데이터를 JAXB에서 실행 가능한 Java 객체로 자동 변환합니다.역직렬화할 수 있는 오브젝트는 모두 마샬링 해제할 수 있습니다.단, 그 반대가 참일 필요는 없습니다.
오브젝트를 "마샬링"하는 것은 마샬링된 오브젝트가 "마샬링 해제"되었을 때 오브젝트의 클래스 정의를 자동으로 로드함으로써 원래 오브젝트의 복사본을 얻을 수 있도록 오브젝트의 상태와 코드베이스를 기록하는 것을 의미합니다.serializable 또는 remote(즉, java.rmi를 구현) 가능한 모든 개체를 가져올 수 있습니다.리모트 인터페이스).마샬링은 코드베이스를 기록하는 것을 제외하면 시리얼라이제이션과 같습니다.마샬링은 리모트오브젝트를 특별히 취급한다는 점에서 시리얼라이제이션과는 다릅니다.
…
메서드가 [다른 Java 가상 머신의 개체에서] 호출 가능한 개체는 java.rmi를 구현해야 합니다.리모트 인터페이스이러한 개체가 호출되면 해당 인수가 마샬링되고 로컬 가상 시스템에서 원격 시스템으로 전송됩니다. 여기서 인수는 마샬링되지 않고 사용됩니다.
--
Microsoft 의 경우.NET, 마샬링은 리모트콜을 사용할 때 시리얼화를 참조하기 위해서도 사용됩니다.
개체를 값별로 정렬하면 개체의 복사본이 생성되어 서버에 직렬화됩니다.해당 오브젝트에 대해 발신된 메서드콜은 모두 서버에서 실행됩니다.
--
사용.
마샬링은 프로세스 간 및/또는 스레드 간에 데이터를 전송해야 하는 서로 다른 Remote Procedure Call(RPC; 리모트프로시저 호출) 메커니즘의 구현 내에서 사용됩니다.Microsoft의 Component Object Model(COM)에서는 COM 아파트 [6][7]경계를 넘을 때 인터페이스 포인터를 마샬링해야 합니다.에서.NET Framework는 P/Invoke 프로세스에서와 같이 관리되지 않는 유형과 CLR 유형의 변환도 마샬링이 [8]필요한 액션의 예입니다.
또한 Mozilla 어플리케이션 프레임워크 내에서 제공되는XPCOM 테크놀로지를 사용하는 스크립트 및 어플리케이션 내에서 마샬링이 광범위하게 사용됩니다.Mozilla Firefox 브라우저는 이 프레임워크로 구축된 일반적인 응용 프로그램입니다.또한 스크립트 언어에서 XPCOM을 사용하여 XPConnect(Cross-Platform Connect)를 사용할 수 있습니다.
예
마이크로소프트 윈도우즈 운영 체제 제품군에서는 Direct3D용 장치 드라이버의 전체 세트가 커널 모드 드라이버입니다.API의 사용자 모드 부분은 Microsoft가 제공하는 DirectX 런타임에 의해 처리됩니다.
이는 사용자 모드에서 커널 모드 작업을 호출하려면 시스템 호출을 수행해야 하며, 이로 인해 CPU가 "커널 모드"로 전환될 수밖에 없기 때문입니다.이 작업은 완료하는 [9]데 마이크로초 정도의 시간이 걸리는 느린 작업입니다.이 시간 동안 CPU는 어떤 작업도 수행할 수 없습니다.따라서 이 스위칭 조작을 실행할 필요가 있는 횟수를 최소한으로 억제하면 퍼포먼스가 대폭 최적화됩니다.
Linux OpenGL 드라이버는 커널 드라이버와 사용자 공간 드라이버의 2가지로 분할됩니다.사용자 공간 드라이버는 OpenGL 명령어를 머신 코드로 변환하여 GPU에 송신합니다.시스템 호출 수를 줄이기 위해 사용자 공간 드라이버는 마샬링을 구현합니다.GPU의 명령 버퍼에 렌더링 데이터가 가득 찬 경우 API는 요청된 렌더링 콜을 임시 버퍼에 저장할 수 있으며 명령 버퍼가 거의 비어 있을 경우 커널 모드로 전환하여 저장된 여러 명령을 한꺼번에 추가할 수 있습니다.
포맷
XML은 시스템 간에 데이터를 전송하는 수단 중 하나입니다.예를 들어 Microsoft는 Microsoft Office 스위트의 다양한 컴포넌트(Word, Excel, Access, PowerPoint 등)의 파일 형식의 기반으로 이 파일을 사용합니다(Office Open XML 참조).통상, 상세한 와이어 형식이 됩니다만, XML 의 완전한 「start-tag」, 「end-tag」구문을 사용하면, 보다 정확한 진단이 가능하게 되어, 전송 에러나 디스크 에러로부터 간단하게 회복할 수 있습니다.또한 태그가 반복적으로 발생하기 때문에 표준 압축 방법을 사용하여 콘텐츠를 축소할 수 있습니다.Office 파일 형식은 모두 [10]원시 XML 압축으로 작성됩니다.JSON(JavaScript Object Notation) 등의 대체 형식은 보다 간결하지만 오류 복구에 대한 안정성은 떨어집니다.
일단 데이터가 프로그램이나 어플리케이션으로 전송되면 다시 오브젝트로 변환하여 사용해야 합니다.따라서 언마샬링은 일반적으로 Remote Method Invocation(RMI) 및 Remote Procedure Call(RPC; 리모트프로시저 호출) 메커니즘 구현의 리시버 엔드에서 실행 가능한 형식으로 전송되는 오브젝트에 대해 사용됩니다.
JAXB
JAXB 또는 Java Architecture for XML Binding은 Java 객체를 정렬하고 마샬을 해제하기 위해 개발자들이 사용하는 가장 일반적인 프레임워크입니다.JAXB는 Java에서 지원되는 기본 데이터 유형과 표준 XML 스키마 데이터 [11]유형 간의 상호 변환을 제공합니다.
Xml Serializer
XmlSerializer는 C# 개발자가 C# 오브젝트의 마셜 및 마셜 해제를 위해 사용하는 프레임워크입니다.Java에 비해 C#의 장점 중 하나는 XmlSerializer 클래스가 포함되어 있기 때문에 C#이 기본적으로 마샬링을 지원한다는 것입니다.한편 Java는 마샬링을 [12]지원하기 위해 JAXB 형식의 비원어민 글루 코드가 필요합니다.
XML 및 실행 파일 표현
언마샬링의 예로는 오브젝트의 XML 표현을 임의의 프로그래밍 언어로 오브젝트의 디폴트 표현으로 변환하는 것을 들 수 있습니다.다음 클래스를 고려하십시오.
일반의 학급 학생입니다 { 사적인 차 이름.[50]; 사적인 인트 아이디; 일반의 스트링 getName() { 돌아가다 이것..이름.; } 일반의 인트 아이디() { 돌아가다 이것..아이디; } 무효 setName(스트링 이름.) { 이것..이름. = 이름.; } 무효 설정 아이디(인트 아이디) { 이것..아이디 = 아이디; } }
- Student 객체의 XML 표현:
<!-- 코드 스니펫1 --> <?xml version="1.0" encoding="UTF-8"?> <filen id="11235813"> <name> </filen> </filen> <filen id="21345589"> <name>샤임 </name> </student>
- Student 객체의 실행 가능한 표현:
// 코드 스니펫 2 학생입니다 s1 = 신규 학생입니다(); s1.설정 아이디(11235813); s1.setName(자야라만); 학생입니다 s2 = 신규 학생입니다(); s2.설정 아이디(21345589); s2.setName('샤임');
Unmarshalling은 Code Snipped 1의 XML 표현을 Code Scnefit 2의 기본 실행 파일 Java 표현으로 변환합니다.
자바에서의 언마셜링
JAXB의 언마샬러
XML 데이터를 실행 가능한 Java 개체로 이동 해제하는 프로세스는 내장된 Unmarshaller 클래스에서 처리합니다.Unmarshaller 클래스에 정의되어 있는 Unmarshal 메서드는 파일, 파일 입력 스트림,[13] URL 등 다양한 유형의 입력에서 XML을 받아들이기 위해 오버로드됩니다.다음은 예를 제시하겠습니다.
JAXBContext 모니터 = JAXBContext.newInstance("com.acme.foo"); 언마샬러 우마 = 모니터.create Unmarshaller(); 물건 obj = 우마.마샬을 벗기다(신규 파일("input.xml"));
XML 데이터 전송 해제
Unmarshal 메서드는 전체 XML 문서 또는 일부 XML 문서를 역직렬화할 수 있습니다.XML 루트 요소가 글로벌하게 선언되면 이러한 메서드는 JAXBContext가 XML 루트 요소를 JAXB 매핑클래스에 매핑하여 언마샬링을 시작합니다.매핑이 충분하지 않고 루트 요소가 로컬로 선언된 경우 unmarshal 메서드는 unmarshalling 프로세스에 despiredType 메서드를 사용합니다.이 두 가지 접근법은 다음과 같습니다.[13]
글로벌 XML 루트 요소의 마크를 해제합니다.
unmarshal 메서드는 루트 요소가 글로벌하게 선언된 경우 JAXBContext를 사용하여 XML 데이터의 마샬을 해제합니다.JAXBContext 객체는 항상 글로벌하게 선언된 XML 요소와 그 이름을 JAXB 매핑클래스에 매핑을 유지합니다.XML 요소 이름 또는 XML 요소 이름@xsi:type
attribute는 JAXB 매핑클래스와 일치합니다.unmarshal 메서드는 적절한 JAXB 매핑클래스를 사용하여 XML 데이터를 변환합니다.단, XML 요소명이 일치하지 않으면 Unmarshal 프로세스가 중단되고 UnmarshalException이 느려집니다.이는 declaredType [14]메서드에 의한 unmarshal을 사용함으로써 회피할 수 있습니다.
로컬 XML 루트 요소의 마셜을 해제합니다.
루트 요소가 글로벌하게 선언되지 않은 경우 응용 프로그램은 declaredType 매개 변수를 사용하여 응용 프로그램에서 제공한 매핑을 통해 마샬러를 지원합니다.루트 이름에 적절한 JAXB 클래스에 대한 매핑이 있는 경우에도 우선순위에 따라 declaredType은 매핑을 덮어씁니다.다만,@xsi:type
XML 데이터의 속성은 적절한 JAXB 클래스에 대한 매핑을 가지며, 이는 declaratedType 매개 변수보다 우선합니다.declaratedType 매개 변수별 marshal 해제 메서드는 항상 a를 반환합니다.JAXBElement<declaredType>
사례.이 JAXBlement 인스턴스의 속성은 다음과 [15]같이 설정됩니다.
JAXBelement 속성 | 가치 |
---|---|
이름. | xml 요소 이름 |
가치 | despiredType 인스턴스 |
선언된 유형 | unmarshal 메서드 declaratedType 파라미터 |
범위 | null(알 수 없는 크기) |
「 」를 참조해 주세요.

레퍼런스
- ^ [1]. "What is the difference between Serialization and Marshaling?". Stack Exchange Network. Retrieved 23 July 2021.
{{cite web}}
:외부 링크
(도움말)author=
- ^ "marshal — Internal Python object serialization". Python Software Foundation. Retrieved 4 November 2016.
- ^ "marshal — Internal Python object serialization". Python Software Foundation. Retrieved 9 October 2019.
- ^ "Schema for Representing Java(tm) Objects in an LDAP Directory". IETF. October 1999. Retrieved 4 November 2016.
- ^ "How To Marshal an Object to a Remote Server by Value by Using Visual Basic .NET". Microsoft. July 2004. Archived from the original on 2004-11-15. Retrieved 4 November 2016.
- ^ "Apartments and COM Threading Models". Archived from the original on 2015-09-23. Retrieved 2009-06-19.
- ^ "CoInitializeEx function (COM)". Windows Desktop App Development. Retrieved 2013-02-22.
- ^ Interop Marshaling의 개요
- ^ Code Quality: The Open Source Perspective.
- ^ DOCX 파일이란?https://docs.fileformat.com/word-processing/docx/ 2020년 10월 13일에 접속.
- ^ "Binding XML Schemas - The Java EE 5 Tutorial". docs.oracle.com. Retrieved 2016-09-14.
- ^ "Using the XmlSerializer Class". msdn.microsoft.com. Retrieved 2016-09-23.
- ^ a b "Unmarshaller (JAXB 2.2.3)". jaxb.java.net. Retrieved 2016-09-14.
- ^ "JAXBContext (JAXB 2.2.3)". jaxb.java.net. Retrieved 2016-09-23.
- ^ "JAXBElement (JAXB 2.2.3)". jaxb.java.net. Retrieved 2016-09-23.