ser*_*hio 7 .net c# vb.net serialization .net-2.0
在.NET(至少<= 2)中,序列化对象时会出现问题,这些对象会在非序列化对象(如Windows窗体)处理这些事件时引发事件.
由于VB.NET实现事件的方式,当您序列化对象时,其事件也会被序列化(因为事件实际上是使用隐藏的多播委托字段实现的).这样做的副作用是,处理被序列化对象引发的事件的任何对象都将被视为对象图的一部分,并且也将被序列化.
可以找到一些解决方法,实现自定义序列化或使用委托而不是事件:
然而,它们似乎都没有完全满足作者和用户.
.NET 3/4是否解决了这个问题?
事件通过创建委托成员来处理。如果您自己显式定义此成员,则应该能够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)