.NET 3/4 События Разрешений, чтобы быть Двоичным De/Serialized?

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

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

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

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

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

7
задан serhio 26 February 2010 в 11:55
поделиться

1 ответ

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