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出现在远程界面中的任何时候自动使用,并且会序列化IEnumerator<string>到一个客户端,该客户端EnumeratorBatchHandlerClient<string>具有一个连接到服务器端的 .NET 远程代理EnumeratorBatchHandlerServer<string>

我认为客户端批处理程序看起来像这样:

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 批处理代理”?

更新:我这样做的一个狡猾的想法是建立一个RealProxy可以插入存根的工作,并将其粘贴在我的远程班级前面。我想如果我使客户端处理程序可序列化和服务器处理程序 marshalbyref 它会将客户端处理程序发送到 cilent 端并让它与服务器处理程序远程对话。我构建了这样一个 RealProxy,它会忠实地实例化我的EnumeratorClientBatchHandler<>,并且EnumeratorServerBatchHandler<>任何时候它看到一个IEnumerator. 但是,我不能RealProxy使用 .NET 远程处理“远程”,因为它不能同时是MarshalByRefObjectand的子类RealProxy

我看到的唯一前进道路是构建我自己的远程处理系统,它不需要接口实现成为 MarshalByRefObject 的子类来代理远程它们。我看不出这是不可能的任何原因,因为看起来 RealProxy 可以代理任何接口类型。(只有 .NET 远程处理检查基础类型是 MarshalByRefObject)。作为附带的好处,我认为拥有一个使用新的 C# 5.0 异步系统来允许异步处理程序为“标准”接口提供服务的远程处理系统会很好。


下面的这个 Q/A 似乎是半相关的,并讨论了将自定义序列化程序 (protobuf) 与 WCF 一起使用。但是,这与我在某些方面寻找的不同。(1)它仍然将所有数据序列化为二进制流,没有像上面我需要的“正在进行的代理通道”来继续通过远程通道发出代理批处理调用,(2)翻译返回结果的手动 WCF 模式到 EndpointAddress10 似乎与上述模式不兼容。

如何在 .NET 远程处理期间使用自定义序列化?

当然我知道我可以制作一个远程接口,它是批处理接口,然后让客户端手动处理批处理......或者让他们手动将批处理接口包装在他们自己的 EnumerableBatchHandlerClient 实例中。我试图弄清楚如何以透明的方式做到这一点,因为我将有许多通过特定系统出售的接口,IEnumerables 将非常常见,我希望远程处理是“自动的”任何看起来像基本数据类型调用或 IEnumerable(具有批处理支持)的东西。

4

0 回答 0