コンピュータサイエンスにおいて、マーシャリングまたはマーシャリング(米国式スペル)は、オブジェクトのメモリ表現を、特に異なるランタイム間での保存または転送に適したデータ形式に変換するプロセスです。[要出典]これは通常、データをコンピュータプログラムの異なる部分間で、またはあるプログラムから別のプログラムに移動する必要がある場合に使用されます。
マーシャリングは、プリミティブ オブジェクトに制限されるのではなく、複合オブジェクトを使用できるため、複雑な通信を簡素化します。
シリアル化との比較
マーシャリングはシリアル化と似ているか同義ですが、技術的にはシリアル化はオブジェクトをマーシャリングするプロセスの 1 つのステップです。
- マーシャリングとは、クライアントからサーバーにライブオブジェクトを転送する全体的な意図またはプロセスを説明することです(クライアントとサーバーは、任意の通信リンク (ソケット)の対応する端にマッピングされる抽象的でミラー化された概念として扱われます)。オブジェクトをマーシャリングするポイントは、実行中の 1 つのプログラムに存在するオブジェクトを、実行中の別のプログラムにも存在させることです。つまり、クライアント上のオブジェクトはサーバーに転送される必要があります。これは、通信ソケットに循環する中間のシリアル化された「ドライ」表現 (これは 2 番目に重要です) を利用して、オブジェクトの構造、データ、および状態をランタイムから別のランタイムに移行できるようにする具体化の形式です。
- シリアル化は、必ずしも同じ意図を持っているわけではありません。シリアル化は、データを変換してオブジェクトの中間的な「ドライ」表現 (たとえば、バイト ストリーム) を生成することだけを目的としており、その表現は別のランタイムで具体化することも、データベース、ファイル、またはメモリに単純に保存することもできます。
マーシャリングとシリアル化は異なる方法で行われる可能性がありますが、通常は何らかの形式のシリアル化がマーシャリングに使用されます。[1]
デシリアライゼーションという用語は、サーバー側でドライ オブジェクトをアンマーシャリングすること、つまり、ライブ オブジェクトを戻すためにデマーシャリング (またはアンマーシャリング) することと多少似ています。つまり、シリアル化されたオブジェクトは、内部データ構造、つまりターゲット ランタイム内のライブ オブジェクトに変換されます。これは通常、マーシャリングの正確な逆プロセスに対応しますが、プロセスの両端で特定のビジネス ロジックがトリガーされる場合もあります。
マーシャリングの正確な定義は、Python、Java、.NETなどのプログラミング言語によって異なり、状況によってはシリアル化と同じ意味で使用されます。
さまざまなプログラミング言語でのマーシャリング
オブジェクトを「シリアル化」するということは、その状態をバイト ストリームに変換して、バイト ストリームをオブジェクトのコピーに戻すことを意味します。これは本質的にはアンマーシャリングです。プログラミング言語によって、この 2 つの概念を区別するかどうかが異なります。例をいくつか挙げます。
Pythonでは、「マーシャル」という用語は、Python標準ライブラリ[2]内の特定の種類の「シリアル化」 、つまり内部Pythonオブジェクトの保存に使用されます。
marshal モジュールは主に、.pyc ファイルの Python モジュールの「疑似コンパイルされた」コードの読み取りと書き込みをサポートするために存在します。
…
Pythonオブジェクトをシリアル化およびデシリアル化する場合は、代わりにpickleモジュールを使用してください。
— Python標準ライブラリ[3]
Java関連のRFC 2713では、リモート呼び出し用にオブジェクトをシリアル化するときにマーシャリングが使用されます。マーシャリングされたオブジェクトは元のオブジェクトの状態を記録し、コードベースを含みます (ここでのコードベースは、ソース コードではなく、オブジェクト コードをロードできる URL のリストを指します)。したがって、オブジェクトの状態とコードベースを変換するには、アンマーシャリングを行う必要があります。アンマーシャラー インターフェイスは、コードベースを含むマーシャリングされたデータを JAXB で実行可能な Java オブジェクトに自動的に変換します。デシリアライズできるオブジェクトはすべてアンマーシャリングできます。ただし、その逆は必ずしも真である必要はありません。
オブジェクトを「マーシャリング」するということは、その状態とコードベースを記録し、マーシャリングされたオブジェクトが「アンマーシャリング」されるときに、おそらくオブジェクトのクラス定義を自動的にロードすることによって、元のオブジェクトのコピーを取得することを意味します。シリアル化可能またはリモート (つまり、java.rmi.Remote インターフェイスを実装する) である任意のオブジェクトをマーシャリングできます。マーシャリングはシリアル化に似ていますが、マーシャリングではコードベースも記録されます。マーシャリングは、リモート オブジェクトを特別に扱うという点でシリアル化とは異なります。
…
[別の Java 仮想マシンのオブジェクトで] メソッドを呼び出すことができるオブジェクトはすべて、java.rmi.Remote インターフェイスを実装する必要があります。このようなオブジェクトが呼び出されると、その引数は整列化されてローカル仮想マシンからリモート仮想マシンに送信され、そこで引数は整列化解除されて使用されます。
— LDAPディレクトリ内のJava(tm)オブジェクトを表現するためのスキーマ(RFC 2713)[4]
.NETでは、リモート呼び出しを使用する場合のシリアル化を指すためにマーシャリングも使用されます。
オブジェクトを値でマーシャリングすると、オブジェクトのコピーが作成され、サーバーにシリアル化されます。そのオブジェクトに対して行われたメソッド呼び出しはすべてサーバー上で行われます。
— Visual Basic .NET を使用してオブジェクトを値によってリモート サーバーにマーシャリングする方法 (Q301116) [5]
使用法と例
マーシャリングは、プロセス間やスレッド間でデータを転送する必要があるさまざまなリモート プロシージャ コール(RPC) メカニズムの実装内で使用されます。
Microsoftのコンポーネントオブジェクトモデル(COM)では、COMアパートメントの境界を越えるときにインターフェイスポインターをマーシャリングする必要があります。[6] [7] .NET Frameworkでは、 P/Invokeプロセスのように、アンマネージ型とCLR型間の変換も、マーシャリングを実行する必要があるアクションの例です。[8]
さらに、マーシャリングは、Mozilla アプリケーション フレームワーク内で提供されるXPCOMテクノロジを使用するスクリプトやアプリケーション内で広く使用されています。Mozilla Firefoxブラウザは、このフレームワークを使用して構築された人気のアプリケーションであり、スクリプト言語でXPConnect (Cross-Platform Connect) を介して XPCOM を使用することもできます。
例
Microsoft Windowsファミリのオペレーティング システムでは、Direct3Dのデバイス ドライバー セット全体がカーネル モード ドライバーです。API のユーザー モード部分は、Microsoftが提供する DirectX ランタイムによって処理されます。
これは、ユーザーモードからカーネルモード操作を呼び出すにはシステムコールを実行する必要があり、必然的にCPUを「カーネルモード」に切り替える必要があるため問題となります。これは遅い操作であり、完了するまでにマイクロ秒単位の時間がかかります。 [9]この間、CPUはいかなる操作も実行できません。したがって、この切り替え操作を実行する回数を最小限に抑えることで、パフォーマンスを大幅に最適化できます。
Linux OpenGL ドライバーは、カーネル ドライバーとユーザー スペース ドライバーの 2 つに分かれています。ユーザー スペース ドライバーは、OpenGLコマンドをGPUに送信するマシン コードに変換する作業をすべて行います。システム コールの数を減らすために、ユーザー スペース ドライバーはマーシャリングを実装します。GPU のコマンド バッファーがレンダリング データでいっぱいの場合、API は要求されたレンダリング コールを一時バッファーに格納するだけで済み、コマンド バッファーが空に近づいたときにカーネル モードに切り替えて、格納されているコマンドを一度に追加できます。
フォーマット
データをマーシャリングするには、シリアル化ターゲットとして選択される特定のデータ形式を活用した何らかのデータ転送が必要です。
XML 対 JSON 対…
XML はそのような形式の 1 つであり、システム間でデータを転送する手段です。たとえば、Microsoft は、Microsoft Office スイートのさまざまなコンポーネント (Word、Excel、Access、PowerPoint など) のファイル形式の基盤として XML を使用しています ( Office Open XMLを参照)。
これは通常、冗長なワイヤ形式になりますが、XML の完全に括弧で囲まれた「開始タグ」、「終了タグ」構文により、より正確な診断と、転送またはディスク エラーからの回復が容易になります。さらに、タグが繰り返し出現するため、標準的な圧縮方法を使用してコンテンツを縮小できます。すべての Office ファイル形式は、生の XML を圧縮して作成されます。 [10] JSON (JavaScript Object Notation)などの代替形式はより簡潔ですが、それに応じてエラー回復の堅牢性が低下します。
データがプログラムまたはアプリケーションに転送されると、使用するためにオブジェクトに戻す必要があります。したがって、アンマーシャリングは、送信されたオブジェクトを実行可能な形式でアンマーシャリングするために、リモート メソッド呼び出し(RMI) およびリモート プロシージャ コール(RPC) メカニズムの実装の受信側で一般的に使用されます。
ジャックスB
JAXB(Java Architecture for XML Binding )は、開発者がJavaオブジェクトのマーシャリングとアンマーシャリングを行うために使用する最も一般的なフレームワークです。JAXBは、Javaでサポートされている基本的なデータ型と標準のXMLスキーマデータ型間の相互変換を提供します。 [11]
XMLシリアライザ
XmlSerializer は、 C#開発者が C# オブジェクトをマーシャリングおよびアンマーシャリングするために使用するフレームワークです。Java に対する C# の利点の 1 つは、C# が XmlSerializer クラスを含んでいるため、ネイティブでマーシャリングをサポートしていることです。一方、Java では、マーシャリングをサポートするために、JAXB 形式の非ネイティブグルー コードが必要です。 [12]
XMLから実行可能な表現へ
アンマーシャリングの例としては、オブジェクトの XML 表現を任意のプログラミング言語のオブジェクトのデフォルト表現に変換することが挙げられます。次のクラスを考えてみましょう。
パブリッククラスStudent { private char name [ 150 ] ; private int ID ; public String getName () { return this . name ; } public int getID () { return this . ID ; } void setName ( String name ) { this . name = name ; } void setID ( int ID ) { this . ID = ID ; } }
- 特定のStudentオブジェクトの XML 表現:
<!-- コード スニペット 1 -->
<?xml version="1.0" encoding="UTF-8"?>
<student id= "11235813" > <name>ジャヤラマン</name> </student> <student id= "21345589" > <name>シャム</name> </student>
- Studentオブジェクトの実行可能表現:
// コードスニペット 2
学生s1 =新しい学生(); s1 . setID ( 11235813 ); s1 . setName ( "Jayaraman" );学生s2 =新しい学生(); s2 . setID ( 21345589 ); s2 . setName ( "Shyam" );
アンマーシャリングは、コード スニペット 1 の XML 表現をコード スニペット 2 のデフォルトの実行可能な Java 表現に変換し、そのコードを実行して一貫性のあるライブ オブジェクトを戻すプロセスです。別の形式を選択した場合、アンマーシャリング プロセスは異なりますが、ターゲット ランタイムでの最終結果は同じになります。
Java でのアンマーシャリング
JAXB のアンマーシャラー
XMLデータを実行可能なJavaオブジェクトにアンマーシャリングするプロセスは、組み込みのUnmarshallerクラスによって処理されます。Unmarshallerクラスで定義されたアンマーシャリングメソッドは、File、FileInputStream、URLなどのさまざまな種類の入力からXMLを受け入れるようにオーバーロードされています。 [13]たとえば、次のようになります。
JAXBContext jcon = JAXBContext.newInstance ( " com.acme.foo" ) ;アンマーシャラーumar = jcon.createUnmarshaller ( ) ;オブジェクトobj = umar.unmarshal ( new File ( "input.xml" ) ) ;
XML データのアンマーシャリング
アンマーシャリングメソッドは、XML文書全体またはその一部をデシリアライズできます。XMLルート要素がグローバルに宣言されている場合、これらのメソッドは、JAXBContextのXMLルート要素からJAXBマップクラスへのマッピングを利用してアンマーシャリングを開始します。マッピングが十分でなく、ルート要素がローカルに宣言されている場合、アンマーシャリングメソッドは、アンマーシャリングプロセスに宣言型メソッドを使用します。これら2つのアプローチは、以下で理解できます。[13]
グローバル XML ルート要素をアンマーシャルする
アンマーシャルメソッドは、ルート要素がグローバルに宣言されている場合、JAXBContext を使用して XML データをアンマーシャルします。JAXBContext オブジェクトは、グローバルに宣言された XML 要素とその名前の JAXB マップクラスへのマッピングを常に維持します。XML 要素名またはその属性が JAXB マップクラスと一致する場合、アンマーシャルメソッドは適切な JAXB マップクラスを使用して XML データを変換します。ただし、XML 要素名が一致しない場合は、アンマーシャルプロセスが中止され、 UnmarshalException@xsi:typeがスローされます。これは、宣言されたタイプによるアンマーシャルメソッドを使用することで回避できます。[14]
ローカル XML ルート要素をアンマーシャルする
ルート要素がグローバルに宣言されていない場合、アプリケーションは、宣言型パラメータを使用してアプリケーションが提供するマッピングによってアンマーシャラーを支援します。優先順位により、ルート名に適切な JAXB クラスへのマッピングがある場合でも、宣言型はマッピングをオーバーライドします。ただし、@xsi:typeXML データの属性に適切な JAXB クラスへのマッピングがある場合は、宣言型パラメータよりも優先されます。宣言型パラメータによるアンマーシャリング メソッドは常にインスタンスを返しますJAXBElement<declaredType>。この JAXBElement インスタンスのプロパティは次のように設定されます: [15]
参照
- 無料のオープンソース グラフィック デバイス ドライバー#ソフトウェア アーキテクチャ
- コンポーネント オブジェクト モデル
- コルバ
- ピクルス(Python)
- プロトコル バッファ
- XML バインディングのための Java アーキテクチャ
- 呼び出し規約
参考文献
- ^ Jeffrey Hantin。「シリアル化とマーシャリングの違いは何ですか?」。Stack Exchange Network 。 2021年7月23日閲覧。
- ^ 「marshal — Python オブジェクトのシリアル化の内部処理」。Python Software Foundation。2016年11 月 4 日閲覧。
- ^ 「marshal — Python オブジェクトのシリアル化の内部処理」。Python Software Foundation。2019年10 月 9 日閲覧。
- ^ 「LDAP ディレクトリ内の Java(tm) オブジェクトを表すスキーマ」。IETF。1999 年 10 月。2016 年11 月 4 日閲覧。
- ^ 「Visual Basic .NET を使用してオブジェクトを値渡しでリモート サーバーにマーシャリングする方法」。Microsoft。2004 年 7 月。2004 年 11 月 15 日時点のオリジナルよりアーカイブ。2016年11 月 4 日に取得。
- ^ 「アパートメントと COM スレッド モデル」。2015 年 9 月 23 日時点のオリジナルよりアーカイブ。2009 年 6 月 19 日閲覧。
- ^ 「CoInitializeEx 関数 (COM)」。Windows デスクトップ アプリ開発。2013年 2 月 22 日閲覧。
- ^ 相互運用マーシャリングの概要
- ^ コード品質: オープンソースの観点。
- ^ DOCX ファイルとは何ですか? https://docs.fileformat.com/word-processing/docx/ 2020 年 10 月 13 日にアクセス。
- ^ 「XML スキーマのバインディング - Java EE 5 チュートリアル」。docs.oracle.com。2016年9 月 14 日閲覧。
- ^ 「XmlSerializer クラスの使用」。msdn.microsoft.com。2016年 9 月 23 日閲覧。
- ^ ab "Unmarshaller (JAXB 2.2.3)". jaxb.java.net . 2016年9月14日閲覧。
- ^ "JAXBContext (JAXB 2.2.3)". jaxb.java.net . 2016年9月23日閲覧。
- ^ "JAXBElement (JAXB 2.2.3)". jaxb.java.net . 2016年9月23日閲覧。
