Разрешает ли .NET 3/4 события быть двоичными / сериализованными? - PullRequest
7 голосов
/ 25 февраля 2010

В .NET (как минимум <= 2) существует проблема с сериализацией объектов, которые вызывают события, когда эти события обрабатываются несериализуемым объектом (например, формой Windows). </p>

Из-за способа, которым VB.NET реализует события, когда вы сериализуете объект, его события тоже сериализуются (потому что события на самом деле реализуются с использованием скрытых полей делегата многоадресной рассылки). Побочным эффектом этого является то, что любой объект, который обрабатывает события, вызванные сериализуемым объектом, будет считаться частью графа объекта и также будет сериализован.

Можно найти некоторые обходные пути, реализуя пользовательскую сериализацию или используя делегаты вместо событий:

Однако ни один из них, похоже, не полностью удовлетворяет авторов и пользователей.

.NET 3/4 решает эту проблему?

1 Ответ

3 голосов
/ 26 февраля 2010

События обрабатываются созданием члена делегата. Если вы явно определите этот элемент самостоятельно, вы сможете добавить к нему атрибут 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
...