.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>
服务器端EnumeratorBatchHandlerServer<string>
的.NET远程代理。
我认为客户端批处理程序看起来像这样:
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透明地生成和链接我的自定义客户端/服务器“可相关的批处理代理”?
更新:我这样做的一个狡猾的想法是构建一个RealProxy
来完成插入存根的工作,并将其粘贴在我的远程类前面。我想如果我使客户端处理程序可序列化并且服务器处理程序marshalbyref它将客户端处理程序发送到cilent-side并让它远程与服务器处理程序通信。我构建了这样一个RealProxy,并且只要它看到EnumeratorClientBatchHandler<>
,就会忠实地实例化我的EnumeratorServerBatchHandler<>
和IEnumerator
。但是,我无法使用.NET远程处理“远程”RealProxy
,因为它不能同时成为MarshalByRefObject
和RealProxy
的子类。
我看到的唯一前进路径是构建我自己的远程处理系统,该系统不需要接口实现为MarshalByRefObject的子类,以便代理远程它们。我认为没有任何理由这是不可能的,因为看起来RealProxy可以代理任何接口类型。 (只有.NET远程处理检查底层类型是MarshalByRefObject)。作为一个附带好处,我认为拥有一个使用新的C#5.0异步系统的远程处理系统允许异步处理程序为“标准”接口提供服务会更好。
下面的这个Q / A似乎是半相关的,并且讨论了如何在WCF中使用自定义序列化器(protobuf)。但是,这与我正在寻找的方式有所不同。 (1)它仍然将所有数据序列化为二进制流,没有“正在进行的代理通道”,例如我上面需要继续通过远程通道发出代理批量调用,(2)翻译返回结果的手动WCF模式到EndpointAddress10似乎与上面的模式不兼容。
How to use custom serialization during .NET remoting?
当然我知道我可以创建一个 IS 批处理接口的远程接口,然后让客户端手动处理批处理...或让他们手动将批处理接口包装在他们自己的实例中EnumerableBatchHandlerClient。我试图弄清楚如何以透明的方式做到这一点,因为我将通过一个特定的系统提供许多接口,IEnumerables将非常普遍,我希望远程处理能够“自动化”任何看起来像基本数据类型调用或IEnumerable(有批处理支持)的东西。