【问题标题】:.NET Remoting serialize lambda expression based delegate.NET Remoting 序列化基于 lambda 表达式的委托
【发布时间】:2018-11-12 12:13:11
【问题描述】:

我想订阅 MarshalByRefObject 上的一个事件,该事件位于一个单独的进程中。我试过了:

remoteObject.Progress += (sender, args) => { };

这会引发异常,因为 lambda 不可序列化:

System.Runtime.Serialization.SerializationException: 'Type '...+c__DisplayClass3_0' in Assembly '...' 未标记为可序列化。'

显然,我无法将此编译器生成的类型标记为[Serializable]。如何使用 Remoting 订阅事件?

【问题讨论】:

  • 不如 lambda 优雅,但是创建一个包含目标方法的简单、可序列化的类怎么样?
  • @Alejandro 谢谢,我根据您的建议制定了一个解决方案。如果有人有更好的解决方案,我会全力以赴。

标签: .net remoting


【解决方案1】:

正如@Alejandro 在 cmets 中所建议的,一种可能的解决方法是创建一个类。我构建了这个解决方案:

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,可以为所欲为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-30
    相关资源
    最近更新 更多