В.NET (по крайней мере <=2) существует проблема, сериализирующая объекты, которые генерируют события, когда те события обрабатываются несериализуемым объектом (как Windows Form).
Из-за пути 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