.NET 3/4允许事件是二进制De /序列化?

ser*_*hio 7 .net c# vb.net serialization .net-2.0

在.NET(至少<= 2)中,序列化对象时会出现问题,这些对象会在非序列化对象(如Windows窗体)处理这些事件时引发事件.

由于VB.NET实现事件的方式,当您序列化对象时,其事件也会被序列化(因为事件实际上是使用隐藏的多播委托字段实现的).这样做的副作用是,处理被序列化对象引发的事件的任何对象都将被视为对象图的一部分,并且也将被序列化.

可以找到一些解决方法,实现自定义序列化或使用委托而不是事件:

然而,它们似乎都没有完全满足作者和用户.

.NET 3/4是否解决了这个问题?

Pau*_*ams 3

事件通过创建委托成员来处理。如果您自己显式定义此成员,则应该能够NonSerialized向其添加属性。 请参阅此线程以供参考。

例如:

Public Delegate Sub MyEventDelegate()

<NonSerialized()>Private m_MyEventDelegate As MyEventDelegate

Public Custom Event MyEvent As MyEventDelegate
    AddHandler(ByVal value As MyEventDelegate)
        m_MyEventDelegate = DirectCast(System.Delegate.Combine(m_MyEventDelegate, value), MyEventDelegate)
    End AddHandler

    RemoveHandler(ByVal value As MyEventDelegate)
        m_MyEventDelegate = DirectCast(System.Delegate.Remove(m_MyEventDelegate, value), MyEventDelegate)
    End RemoveHandler

    RaiseEvent()
        If m_MyEventDelegate IsNot Nothing Then
            m_MyEventDelegate.Invoke()
        End If
    End RaiseEvent
End Event
Run Code Online (Sandbox Code Playgroud)