1

MarshalByRefObjectから継承する ClassA などのクラスを作成し、RemotingServices.Marshalメソッドを使用してObjRefオブジェクトを作成すると、ClassA のすべてのプライベート フィールドがシリアル化されますか?

ありがとう

4

1 に答える 1

3

いいえ。MarshalByRefObject の考え方は、リモート処理の目的ですべてがシリアル化されるわけではないということです。代わりに、CLR は、このシナリオでは透過プロキシと呼ばれるものを生成します。見た目も動作も ClassA と同じですが、実際には ClassA ではないため、Transparent と呼ばれます。ClassA のインスタンスへのすべての呼び出しは、リモーティングの境界を越えて、ClassA が作成された元の AppDomain にマーシャリングされます。

編集:さらなる明確化への対応。

このシナリオでデータを MarshalByRefObject に渡す場合、データの型を考慮する必要があります。基本的に MarshalByRefObject から派生するか、派生しません。MarshalByRefObject から派生する場合、パラメーターはプロキシとして渡されます。MarshalByRefObject から派生していない場合は、シリアル化され、一連のバイトとして AppDomain 境界を越えて渡された後、ターゲット AppDomain で逆シリアル化されます。

あなたのシナリオでは、MarshalByRef ではない文字列をリストしました (通常、これらを MarshalByValue と呼びますが、これは純粋な規則です)。そのため、リモーティング境界を越えて渡されるとシリアル化されます。

于 2008-11-26T16:30:15.403 に答える