我想订阅IntStream
上一个单独过程中的事件。我尝试过:
return IntStream.range(0, args.length)
.collect(HashMap::new,
(m,i)->m.put(argNames[i],args[i]),
(m1,m2)->m1.putAll (m2));
由于lambda不可序列化,因此引发异常:
System.Runtime.Serialization.SerializationException:程序集'...'中的'Type'... + <> c__DisplayClass3_0'未标记为可序列化。'
很显然,我无法标记此编译器生成的类型return IntStream.range(0, args.length)
.collect(HashMap::new,
(m,i)->m.put(argNames[i],args[i]),
Map::putAll);
。如何使用远程订阅事件?
答案 0 :(得分:0)
正如@Alejandro在评论中所建议的那样,可能的解决方法是创建一个类。我构造了此解决方案:
class DelegateAdapter<T> : MarshalByRefObject
{
Action<T> localHandler;
public DelegateAdapter(Action<T> localHandler)
{
this.localHandler = localHandler;
}
public void RemoteHandler(T value) => localHandler(value);
}
它可以像这样使用:
[Serializable]
delegate void MyCustomDelegate(SomeType arg);
MyCustomDelegate dlg = new DelegateAdapter<SomeType>(arg => { ... }).RemoteHandler;
委托是可序列化的。目标是调用过程中的MarshalByRefObject
,它可以执行您想要的任何操作。