5

.NET リモート処理は、次のようなシリアル化可能なメンバーを持つインターフェイスの透過的なプロキシ リモートを生成できます。

public interface INetworkInterface {
  bool login(string username, string password);
  bool ExecuteSomething(string command);
}

IEnumerator<T>返された結果に対して、カスタムシリアライザーとアクティブなプロキシーリモートを提供したいと思います。私のカスタム プロキシ リモートは、ネットワーク経由で一度に特定の数の要素のバッチ処理を処理します。たとえば、次のインターフェイスがあるとします。

public interface INetworkInterface2 {
    IEnumerable<string> ExecuteSomething(string command);
}

IEnumerator<T> where T:ISerializableリモート インターフェイスに が表示されるたびに自動的に使用されるカスタム シリアライザーとプロキシを提供したいと思います。サーバー側への .NET リモート プロキシを持つIEnumerator<string>クライアント側にシリアル化します。EnumeratorBatchHandlerClient<string>EnumeratorBatchHandlerServer<string>

client-batch-handler は次のようになると思います。

class EnumeratorBatchHandlerClient<T> : IEnumerable<T> {
    List<T> batched_results = new List<T>();
    EnumerableBatchHandlerServer server_proxy;    
    T cur = null;
    bool MoveNext() {
      if (batched_results.Count == 0) {
          batched_results = server_proxy.getNextBatch().ToList();
          if (batched_results.Count == 0) {
            return false;  // we are really out of results
          }
      } 
      cur = batched_results[0]; batched_results.RemoveAt(0);
      return true;
    }
    public T Current {  get { return cur; } }

}

プロキシされたインターフェイスに IEnumerable が表示されたときに、.NET Remoting でカスタム クライアント/サーバーの "ienumerable バッチ プロキシ" を透過的に生成してリンクさせる方法はありますか?

更新:これを行うために私が持っていた巧妙なアイデアの1つはRealProxy、スタブを挿入する作業を行う を構築し、これをリモートクラスの前に貼り付けることでした。クライアント ハンドラーをシリアライズ可能にし、サーバー ハンドラー marshalbyref を作成すると、クライアント ハンドラーが cilent 側に送信され、リモートでサーバー ハンドラーと通信できるようになると考えました。私はそのような RealProxy を構築しEnumeratorClientBatchHandler<>ましEnumeratorServerBatchHandler<>IEnumerator。ただし、同時に のサブクラスになることはできないため、.NET リモート処理を使用して を「リモート」することはRealProxyできません。MarshalByRefObjectRealProxy

私が見ている唯一の方法は、インターフェイスの実装を MarshalByRefObject のサブクラスにする必要のない独自のリモート システムを構築して、それらをリモートでプロキシすることです。RealProxy は任意のインターフェイス タイプをプロキシできるように見えるため、これが不可能な理由はわかりません。(.NET リモート処理のみが、基になる型が MarshalByRefObject であることを確認しています)。副次的な利点として、新しい C# 5.0 非同期システムを使用して、非同期ハンドラーが「標準」インターフェイスにサービスを提供できるようにするリモート システムがあればいいと思います。


以下のこの Q/A はやや関連しているようで、WCF でのカスタム シリアライザー (protobuf) の使用について説明しています。ただし、これはいくつかの点で私が探しているものとは異なります。(1) それでもすべてのデータをバイナリ ストリームにシリアル化します。上記のように、リモート チャネルを介してプロキシ バッチ呼び出しを発行し続けるために必要な「進行中のプロキシ チャネル」はありません。(2) 戻り結果を変換する手動の WCF パターンto EndpointAddress10 は、上記のパターンと互換性がないようです。

.NET リモート処理中にカスタム シリアル化を使用する方法

もちろん、バッチ処理インターフェースであるリモート処理インターフェースを作成し、クライアントにバッチ処理を手動で処理させるか、バッチ処理インターフェースを EnumerableBatchHandlerClient の独自のインスタンスに手動でラップさせることができることはわかっています。特定のシステムを介して多くの多くのインターフェイスを販売する予定であり、IEnumerables は非常に一般的であり、リモーティングを「自動魔法」にしたいので、透過的な方法でこれを行う方法を理解しようとしています。 basic-datatype 呼び出しまたは IEnumerable (バッチ サポートあり) のように見えるもの。

4

0 に答える 0