在 .NET 中(至少 <=2)序列化对象时会出现问题,当这些事件由不可序列化的对象(如 Windows 窗体)处理时引发事件。
由于 VB.NET 实现事件的方式,当您序列化一个对象时,它的事件也会被序列化(因为事件实际上是使用隐藏的多播委托(delegate)字段实现的)。这样做的一个副作用是,任何处理由被序列化的对象引发的事件的对象都将被视为对象图的一部分,并且也将被序列化。
可以找到一些解决方法,实现自定义序列化或使用委托(delegate)而不是事件:
- http://www.codeproject.com/KB/vb/serializevbclasses.aspx
- http://www.lhotka.net/WeBlog/CommentView.aspx?guid=776f44e8-aaec-4845-b649-e0d840e6de2c
然而,它们似乎都不能完全满足作者和用户。
.NET 3/4 是否解决了这个问题?
最佳答案
事件通过创建委托(delegate)成员来处理。如果您自己明确定义此成员,则应该能够向其添加 NonSerialized
属性。 See this thread for a reference.
例如:
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
关于c# - .NET 3/4 是否允许对事件进行二进制反序列化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2335931/