75

少なくともここでは、この質問が尋ねられたことを知っています。

しかし、少なくとも私にとっては、満足のいく答えはありませんでした。アンマネージ コードとの相互運用に関してマーシャリングについては多くの議論がありますが、.NET で行う必要がある場合のように、あるスレッドから別のスレッドへのマーシャリングについてはどうでしょうか。

これは、マーシャリングとは何ですか? マーシャリングの定義を与えるとき、スレッド間で「マーシャリング」している場合だけでなく、相互運用性のケースを説明するには、どのように定義しますか?

4

6 に答える 6

89

多くの場合、計算ではデータをあるサイトから別のサイトに移動する必要があり、共有メモリはありません。したがって、1 つの計算がデータを含むメッセージを別の計算に送信します。

そのデータが恣意的に複雑な場合、メッセージでどのように送信する必要がありますか?

マーシャリングは、データ フィールド、または関連する構造のセット全体を、メッセージで送信できるシリアル化された文字列に変換するプロセスです。2 進数をマーシャリングするには、メッセージ形式がテキストでなければならない場合、それを 16 進数文字列に変換することがあります。メッセージがバイナリ データを運ぶ場合、2 進数は 4 つのリトル エンディアン正規化バイナリ バイトに変換され、その方法で送信されます。ポインターはより困難です。多くの場合、それらを実際のメモリ位置から独立した抽象的な参照 (「ノード番号」など) に変換する必要があります。

もちろん、データを「マーシャリング」すると、最終的には「アンマーシャリング」が必要になります。これは、シリアル ストリームを読み取り、送信されたデータ (構造) を再構築するプロセスです。

多くの場合、ライブラリにはこの目的を達成するために使用される (非) マーシャリング ルーチンがあり、データを送受信するために (非) マーシャリング ルーチンで必要なすべての呼び出しを作成するツールさえある場合があります。

于 2011-04-08T21:19:02.043 に答える
33

マーシャリングとは、何らかの形式のデータを取得し、それを別の形式に変換することです。これは非常に一般的な用語であり、多くの場所で使用されていますが、微妙な意味の違いがあります。

たとえば、.NET では、ネイティブ型を操作しているときに、相互運用レイヤーがデータを .NET 型から適切な形式に "マーシャリング" してネイティブ メソッドを呼び出し、結果を "マーシャリング" します。

スレッド間の「マーシャリング」について - 多くの場合、現在のスレッドとは異なるスレッドでコードを実行する必要があります。たとえば、Windows フォームを使用している場合、スレッドプール スレッドの UI 要素を変更することはできないため、UI スレッドへの呼び出しを "マーシャリング" する必要があります。これは、デリゲートを作成し、Control.Invoke (かなり複雑なシステムを使用してこれを適切な同期コンテキストにポストバックする) を介してユーザー インターフェイス スレッドにデリゲートを渡すことによって行われます。これにより、ユーザー インターフェイスでデリゲートが実行されます。あなたのためのスレッド。

于 2011-04-08T21:23:31.253 に答える
12

ウィキペディアの定義は実際にはかなり良いです。

マーシャリングの全体的な概念は、「シリアライゼーション」と同じです。つまり、メモリ内表現 (ある意味では、まったく表現がないようなものです。何かがメモリ内にある場合、単に「存在する」) から「ハード コピー」に移動します。 " 表現、それが XML であるか、バイナリ ストリームか何かであるかに関係なく。ただし、実行内容によっては、ターゲット形式への何らかの変換または変換を意味する場合もあります。

プロセス マーシャリングの場合: あるスレッドが単に別のスレッドを「呼び出す」だけではなく、データをパッケージ化して、あるスレッドから別のスレッドに「送信」する必要があります。マーシャリングは、そのデータ (たとえば、呼び出すメソッドに関するデータとそのパラメーター) をパッケージ化するプロセスです。

相互運用に関してマーシャリングしている場合は、メソッド呼び出しとそのパラメーターを、COM コンポーネントを実行しているプロセス/スレッドに送信できるデータ構造にパッケージ化しています。そのパッケージは、COM コンポーネントが理解できる形式である必要があります。

于 2011-04-08T21:23:50.577 に答える
6

ウィキペディアから-マーシャリング(コンピューターサイエンス)

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

.NET からアンマネージ関数を呼び出す場合、マーシャリングを使用して、.NET のデータをアンマネージ関数が使用できるデータに変換します。たとえば、System.Stringは Unicode ベースですが、その文字列を ANSI 文字列に変換してアンマネージ C 関数に渡す必要がある場合があります。

スレッド化の場合、マーシャリングは通常、あるデータの所有権をあるスレッドから別のスレッドに移すことを指します。たとえば、プログラムには 2 つのスレッドがあります。最初のスレッドがネットワークからデータを読み取り、2 番目のスレッドがそのデータを計算します。ネットワーク スレッドがデータを読み取った後、そのデータを計算スレッドに転送 (つまり、「マーシャリング」) して処理します。これは、2 つのスレッド間で共有されるキューにデータを書き込むことによって行うことができます。

スレッド化でのマーシャリングには、ほとんどの場合、マーシャリングされるデータの同期が含まれます。

于 2011-04-08T21:33:09.660 に答える
5

私が理解しているマーシャリングは、さまざまな操作環境間で一貫した方法でデータを転送する方法を提供するということです。

マネージ コードからアンマネージ コードへのデータのマーシャリングのコンテキストでは、ほぼ同じです。

整数の配列や選択した任意のデータ型などのデータがあり、C++ コードで操作を行った後、C# コード内で使用できるようにしたいと考えています。

C# のコードに対して、「ここが配列です。やりたいことをやってください」とだけ言うことはできません。C++ の int の配列は、C# と同じ方法で格納できない場合があります。マーシャリングにより、このデータを環境に依存しない方法で送信して、どちらの側でもデータがまったく同じ方法で見えるようにします。

もう 1 つの例は、ネットワーキングです。通常、これをマーシャリングとは呼びませんが、ネットワーク経由で送信する場合は、通常、受信者がデータを解釈するのと同じ方法でデータを解釈するように送信する必要があります。あなたのコンピュータはリトル エンディアン順でデータを表し、もう一方のコンピュータはビッグ エンディアン順でデータを表すことができます。

tl;dr: マーシャリングは、さまざまな動作環境でデータを一貫して表現する方法を提供します

于 2011-04-08T21:21:52.177 に答える
1

通常、「XML 形式で書かれた」という文脈で使用されますが、任意の形式にマーシャリングすることができます。

2.  To arrange, place, or set in methodical order.
   (from American Heritage® Dictionary of the English Language)

したがって、必要な順序/形式でデータを配置していることを意味します。多くの場合、これは XML 形式です。

于 2011-04-08T21:16:27.840 に答える