マーシャリング (コンピューターサイエンス)

コンピューター サイエンスではマーシャリングまたはマーシャリング(米国の綴り) は、オブジェクトメモリ表現を保存または送信に適したデータ形式に変換するプロセスです[要出典]これは通常、コンピュータ プログラムの異なる部分間、またはあるプログラムから別のプログラムに データを移動する必要がある場合に使用されます。

マーシャリングは、シリアル化と似ているか、同義である場合がありますマーシャリングとは、クライアントからサーバーにオブジェクトを転送する意図またはプロセスを記述することです。マーシャリングの目的は、ある実行中のプログラムに存在する同じオブジェクトを別の実行中のプログラムにも存在させることです。つまり、クライアント上のオブジェクトをサーバーに転送する必要があります。シリアル化は、データをバイト ストリームなどに変換することのみを考慮しているため、必ずしもこれと同じ意図を持っているわけではありません。マーシャリングとシリアル化は異なる方法で実行される場合がありますが、通常はマーシャリングを行うために何らかの形式のシリアル化が使用されます。[1]

通信にプリミティブ オブジェクトの代わりに複合オブジェクトを使用するため、複雑な通信が簡素化されますマーシャリングの逆のプロセスは、アンマーシャリング(または、デシリアル化と同様のデマーシャリング)と呼ばれます。アンマーシャリング インターフェイスはシリアル化されたオブジェクトを受け取り、それを内部データ構造に変換します。

マーシャリングの正確な定義は、 PythonJava.NETなどのプログラミング言語によって異なり、状況によっては、シリアル化と同じ意味で使用されます。

連載時との比較

オブジェクトを シリアル化」するとは、バイト ストリームをオブジェクトのコピーに戻すことができるような方法で、その状態をバイト ストリームに変換することを意味します。

「マーシャル」という用語は、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]

Microsoft .NET では、マーシャリングは、リモート呼び出しを使用するときにシリアル化を参照するためにも使用されます。

オブジェクトを値でマーシャリングすると、オブジェクトのコピーが作成され、サーバーにシリアル化されます。そのオブジェクトに対して行われたメソッド呼び出しはすべてサーバー上で行われます。

—  Visual Basic .NET を使用して値によってオブジェクトをリモート サーバーにマーシャリングする方法 (Q301116) [5]

使用法

マーシャリングは、プロセス間および/またはスレッド間でデータを転送する必要がある、さまざまなリモート プロシージャ コール(RPC) メカニズムの実装内で使用されますMicrosoft のコンポーネント オブジェクト モデル(COM) では、COM アパートメントの境界を越える場合、インターフェイス ポインターをマーシャリングする必要があります。[6] [7] .NET Frameworkでは、 P/Invokeプロセスのようなアンマネージ型とCLR型の間の変換も、マーシャリングの実行が必要なアクションの例です。[8]

さらに、マーシャリングは、 Mozilla アプリケーション フレームワーク内で提供されるXPCOMテクノロジを使用するスクリプトおよびアプリケーション内で広範囲に使用されますMozilla Firefoxブラウザは、このフレームワークで構築された人気のあるアプリケーションであり、スクリプト言語で XPConnect (クロスプラットフォーム接続) を介して XPCOM を使用できるようになります。

Microsoft Windowsファミリのオペレーティング システムでは、Direct3D用のデバイス ドライバーのセット全体がカーネル モード ドライバーです。APIのユーザー モード部分は、Microsoft が提供する DirectX ランタイムによって処理されます。

これが問題となるのは、ユーザー モードからカーネル モード操作を呼び出すにはシステム コールを実行する必要があり、これにより必然的にCPUが強制的に「カーネル モード」に切り替わることになるためです。これは遅い操作であり、完了するまでにマイクロ秒程度かかります[9]この間、CPU はいかなる操作も実行できません。したがって、この切り替え操作を実行する必要がある回数を最小限に抑えると、パフォーマンスが大幅に最適化されます。

Linux OpenGL ドライバーは、カーネル ドライバーとユーザー空間ドライバーの 2 つに分かれています。ユーザー空間ドライバーは、 OpenGLコマンドをGPUに送信するマシン コードにすべて変換しますシステム コールの数を減らすために、ユーザー空間ドライバーはマーシャリングを実装します。GPU のコマンド バッファーがレンダリング データでいっぱいの場合、API は要求されたレンダリング呼び出しを一時バッファーに保存するだけでよく、コマンド バッファーが空に近づくと、カーネル モードへの切り替えを実行して、多数のレンダリング コールを追加できます。コマンドを一度に保存します。

フォーマット

XMLは、システム間でデータを転送する手段の 1 つです。たとえば、Microsoft は、Microsoft Office スイートのさまざまなコンポーネント (Word、Excel、Access、PowerPoint など) のファイル形式の基礎としてこれを使用しています (「Office Open XML 」を参照)。これにより通常は冗長なワイヤ形式になりますが、XML の完全に括弧で囲まれた「開始タグ」と「終了タグ」の構文により、より正確な診断が提供され、送信エラーやディスク エラーからの回復が容易になります。さらに、タグが繰り返し出現するため、標準の圧縮方法を使用してコンテンツを圧縮できます。すべての Office ファイル形式は、生の XMLを圧縮することによって作成されます。[10] JSONなどの代替形式(JavaScript Object Notation) はより簡潔ですが、それに応じてエラー回復の堅牢性が低くなります。

データがプログラムまたはアプリケーションに転送されたら、使用するためにオブジェクトに変換し直す必要があります。したがって、アンマーシャリングは通常、リモート メソッド呼び出し(RMI) およびリモート プロシージャ コール(RPC) メカニズムの実装の受信側で使用され、送信されたオブジェクトを実行可能形式でアンマーシャリングします。

JAXB

JAXB ( XML バインディングJavaアーキテクチャ)は、開発者が Java オブジェクトをマーシャリングおよびアンマーシャリングするために使用する最も一般的なフレームワークです。JAXB は、Java でサポートされる基本データ型と標準XML スキーマデータ型の間の相互変換を提供します。[11]

Xmlシリアライザー

XmlSerializer は、 C#開発者が C# オブジェクトをマーシャリングおよびアンマーシャリングするために使用するフレームワークですJava に対する C# の利点の 1 つは、XmlSerializer クラスが組み込まれているため、C# はマーシャリングをネイティブにサポートしていることです。一方、Java では、マーシャリングをサポートするために、JAXB 形式の非ネイティブのグルー コードが必要です。[12]

XML と実行可能形式の表現

アンマーシャリングの例としては、オブジェクトの XML 表現を、任意のプログラミング言語でのオブジェクトのデフォルト表現に変換することが挙げられます。次のクラスを考えてみましょう。

パブリッククラスStudent {プライベート文字[ 150 ] ; プライベートint ID ; public String getName () {これを返します名前; public int getID ( ) {これを返しますID ; } void setName ( String name ) { this . 名前=名前; ボイド_  

      
      
      
    
         
    
      
    
         
    
      
    
          
    
     setID ( int ID ) { this . ID = ID ; } } 
    
          
    

  • Studentオブジェクトの XML 表現:
<!-- コード スニペット 1 -->

<?xml version="1.0"coding="UTF-8"?> 
<student id= "11235813" > <name>ジャヤラマン</name> </student> <student id= "21345589" > <name>シャム< /名前> </学生>     
        
    
     
        
    
  • Studentオブジェクトの実行可能表現:
// コード スニペット 2

学生s1 =新しい学生(); s1 セットID ( 11235813 ); s1 setName ( "ジャヤラマン" ); 学生s2 =新しい学生(); s2 セットID ( 21345589 ); s2 setName ( "シャム" );    


    


アンマーシャリングは、コード スニペット 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 (新しいファイル( "input.xml" ));   
   
    

XML データのアンマーシャリング

アンマーシャル メソッドは、XML ドキュメント全体またはその一部を逆シリアル化できます。XML ルート要素がグローバルに宣言されている場合、これらのメソッドは、JAXBContext の XML ルート要素の JAXB マップされたクラスへのマッピングを利用して、アンマーシャリングを開始します。マッピングが不十分で、ルート要素がローカルに宣言されている場合、アンマーシャリング メソッドはアンマーシャリング プロセスに宣言された Type メソッドを使用します。これら 2 つのアプローチは以下で理解できます。[13]

グローバル XML ルート要素をアンマーシャリングする

unmarshal メソッドは、ルート要素がグローバルに宣言されている場合、JAXBContext を使用して XML データをアンマーシャルします。JAXBContext オブジェクトは、グローバルに宣言された XML 要素とその名前の JAXB マップされたクラスへのマッピングを常に維持します。XML 要素名またはその@xsi:type属性が JAXB マップされたクラスと一致する場合、アンマーシャル メソッドは適切な JAXB マップされたクラスを使用して XML データを変換します。ただし、XML 要素名に一致するものがない場合、アンマーシャル プロセスは中止され、 UnmarshalException がスローされますこれは、declaredType メソッドによるアンマーシャルを使用することで回避できます。[14]

ローカル XML ルート要素をアンマーシャリングする

ルート要素がグローバルに宣言されていない場合、アプリケーションは、declaredType パラメーターを使用して、アプリケーションが提供するマッピングによってアンマーシャラーを支援します。優先順位により、ルート名に適切な JAXB クラスへのマッピングがある場合でも、declaredType はマッピングをオーバーライドします。ただし、@xsi:typeXML データの属性に適切な JAXB クラスへのマッピングがある場合、これは、declaredType パラメーターよりも優先されます。DeclaredType パラメータによるアンマーシャル メソッドは常にJAXBElement<declaredType>インスタンスを返します。この JAXBElement インスタンスのプロパティは次のように設定されます: [15]

JAXBElement プロパティ 価値
名前 XML要素名
価値 宣言された型のインスタンス
宣言されたタイプ アンマーシャルメソッドのdeclaredTypeパラメータ
範囲 null (実際のサイズは不明)

こちらも参照

参考文献

  1. ^ [1]。「シリアライゼーションとマーシャリングの違いは何ですか?」スタック交換ネットワーク2021 年7 月 23 日に取得 {{cite web}}:外部リンク|author=(ヘルプ)
  2. ^ "marshal — 内部 Python オブジェクトのシリアル化". Python ソフトウェア財団2016 年11 月 4 日に取得
  3. ^ "marshal — 内部 Python オブジェクトのシリアル化". Python ソフトウェア財団2019 年10 月 9 日に取得
  4. ^ 「LDAP ディレクトリ内の Java(tm) オブジェクトを表現するためのスキーマ」. IETF。1999 年 10 月2016 年11 月 4 日に取得
  5. ^ 「Visual Basic .NET を使用して値によってオブジェクトをリモート サーバーにマーシャリングする方法」。マイクロソフト。2004 年 7 月。オリジナルは 2004 年 11 月 15 日にアーカイブされました2016 年11 月 4 日に取得
  6. ^ "アパートメントと COM スレッド モデル". 2015 年 9 月 23 日にオリジナルからアーカイブされました2009 年 6 月 19 日に取得
  7. ^ "CoInitializeEx 関数 (COM)". Windows デスクトップ アプリ開発2013 年 2 月 22 日に取得
  8. ^ 相互運用マーシャリングの概要
  9. ^ コードの品質: オープンソースの観点。
  10. ^ DOCX ファイルとは何ですか? https://docs.fileformat.com/word-processing/docx/ 2020 年 10 月 13 日にアクセス。
  11. ^ "XML スキーマのバインディング - Java EE 5 チュートリアル". docs.oracle.com 2016 年 9 月 14 日に取得
  12. ^ "XmlSerializer クラスの使用". msdn.microsoft.com 2016 年 9 月 23 日に取得
  13. ^ ab 「アンマーシャラー (JAXB 2.2.3)」。jaxb.java.net 2016 年 9 月 14 日に取得
  14. ^ "JAXBContext (JAXB 2.2.3)". jaxb.java.net 2016 年 9 月 23 日に取得
  15. ^ 「JAXBElement (JAXB 2.2.3)」。jaxb.java.net 2016 年 9 月 23 日に取得