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

ウィキペディアから、無料の百科事典
ナビゲーションにジャンプ 検索にジャンプ

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

マーシャリングは、シリアル化と多少いるか、同義語である可能性があります。マーシャリングとは、あるオブジェクトをクライアントからサーバーに転送するインテントまたはプロセスを表します。インテントとは、ある実行中のプログラムに存在するのと同じオブジェクトを別の実行中のプログラムに存在させることです。サーバー上に存在します。シリアル化は、データをたとえばバイトのストリームに変換することだけに関係しているため、必ずしもこの意図を持っているわけではありません。マーシャリングはシリアル化とは別の方法で行われる可能性があると言えますが、通常は何らかの形式のシリアル化が使用されます。[1]

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

マーシャリングの正確な定義は、 PythonJava.NETなどのプログラミング言語によって異なり、一部のコンテキストでは、シリアル化と交換可能に使用されます。

シリアル化との比較

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

「マーシャル」という用語は、Python標準ライブラリ[2]の特定のタイプの「シリアル化」に使用されます–内部のPythonオブジェクトを格納します。

marshalモジュールは、主に.pycファイルのPythonモジュールの「疑似コンパイル済み」コードの読み取りと書き込みをサポートするために存在します。

Pythonオブジェクトをシリアル化および逆シリアル化する場合は、代わりにpickleモジュールを使用してください

—Python 標準ライブラリ[3]

Java関連のRFC2713 では、リモート呼び出し用にオブジェクトをシリアル化するときにマーシャリングが使用されます。マーシャリングされるオブジェクトは、元のオブジェクトの状態を記録し、コードベースを含みます(ここでのコードベースとは、ソースコードではなく、オブジェクトコードをロードできるURLのリストを指します)。したがって、オブジェクトの状態とコードベースを変換するには、アンマーシャリングを実行する必要があります。unmarshallerインターフェースは、コードベースを含むマーシャリングされたデータを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(Cross-Platform Connect)を介して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など)のファイル形式の基礎としてこれを使用しています。OfficeOpenXMLを参照してくださいこれにより、通常、メッセージワイヤ形式が長くなります(つまり、より冗長になります)が、XMLの完全に括弧で囲まれた「開始タグ」、「終了タグ」構文により、より正確な診断を提供し、送信エラーまたはディスクエラーからの回復が容易になります。さらに、タグはオブジェクト全体で繰り返し発生するため、標準の圧縮方法を使用してオブジェクトを縮小できます。すべてのOfficeファイル形式は、生のXMLでZIPアルゴリズムを使用して作成されます。[10]

JSON(JavaScript Object Notation)などの代替形式はより簡潔です-JSONは開始/終了タグの代わりに中括弧を使用します-しかし、それに応じてエラー回復の堅牢性は低くなります。

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

JAXB

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

XmlSerializer

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

XMLと実行可能表現

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

パブリック クラス Student 
{
    プライベート 文字 [ 50 ] ; 
    プライベート intID  ; _ public String getName (){これを返します名前; } public int getID (){これを返しますID ; } void setName String name { this 名前=名前; } void
      
    
         
    
      
    
         
    
      
    
          
    
     setID int  ID 
    { 
        this ID  =  ID ; 
    } 
}
  • StudentオブジェクトのXML表現
<!-コードスニペット:1->

<?xml version =“ 1.0” encoding =“ UTF-8”?> 
    <student  id =  “ 11235813” > 
        <name> Jayaraman </ name> 
    </ student> 
    <student  id =  “ 21345589” > 
        <name> Shyam < / name> 
    </ student>
  • Studentオブジェクトの実行可能表現:
//コードスニペット:2

Student  s1  =  new  Student (); 
s1 setID 11235813 ); 
s1 setName "Jayaraman" ); 
Student  s2  =  new  Student (); 
s2 setID 21345589 ); 
s2 setName "Shyam" );

コードスニペット1によって作成されたオブジェクトのXML表現から、コードスニペット2によって作成されたオブジェクトのデフォルトの実行可能Java表現への変換は、アンマーシャリングと呼ばれます。

Javaでのアンマーシャリング

JAXBのUnmarshaller

XMLデータを実行可能なJavaオブジェクトにアンマーシャリングするプロセスは、組み込みのUnmarshallerクラスによって処理されます。また、マーシャリングが解除されたときにXMLデータを検証します。Unmarshallerクラスで定義されたunmarshalメソッドは、さまざまなタイプのXML入力に対してオーバーロードされます。アンマーシャルメソッドの重要な実装のいくつか:[13]

  • XMLファイルからのアンマーシャリング:
JAXBContext  jcon  =  JAXBContext newInstance "com.acme.foo" ); 
Unmarshaller  umar  =  jcon createUnmarshaller (); 
オブジェクト obj  =  umar unmarshal new  File "input.xml" ));
  • InputStream内のXMLファイルからのアンマーシャリング:
InputStream  istr  =  new  FileInputStream "input.xml" ); 
JAXBContext  jcon  =  JAXBContext newInstance "com.acme.foo" ); 
Unmarshaller  umar  =  jcon createUnmarshaller (); 
オブジェクト obj  =  umar アンマーシャルistr );
  • URL内のXMLファイルからのアンマーシャリング:
JAXBContext  jcon  =  JAXBContext newInstance "com.acme.foo" ); 
Unmarshaller  umar  =  jcon createUnmarshaller (); 
URL  url  = 新しい URL "http://merrilllynch.employee/input.xml" ); 
オブジェクト obj  =  umar アンマーシャルurl );

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

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

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

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

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

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

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

も参照してください

参照

  1. ^ [1]「シリアル化とマーシャリングの違いは何ですか?」StackExchangeNetwork 2021年7月23日取得 {{cite web}}:(ヘルプ外部リンク|author=
  2. ^ "marshal —内部Pythonオブジェクトのシリアル化"PythonSoftwareFoundation 2016年11月4日取得
  3. ^ "marshal —内部Pythonオブジェクトのシリアル化"PythonSoftwareFoundation 2019年10月9日取得
  4. ^ 「LDAPディレクトリでJava(tm)オブジェクトを表現するためのスキーマ」IETF。1999年10月2016年11月4日取得
  5. ^ 「VisualBasic.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スキーマのバインド-JavaEE5チュートリアル」docs.oracle.com 2016年9月14日取得
  12. ^ 「XmlSerializerクラスの使用」msdn.microsoft.com 2016年9月23日取得
  13. ^ a b "Unmarshaller(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日取得