.NET Remoting基于Lambda表达式的序列化委托

时间:2018-11-12 12:13:11

标签: .net remoting

我想订阅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); 。如何使用远程订阅事件?

1 个答案:

答案 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,它可以执行您想要的任何操作。