2010-02-25 3 views
7

In .NET (mindestens < = 2) gibt es ein Problem beim Serialisieren von Objekten, die Ereignisse auslösen, wenn diese Ereignisse von einem nicht serialisierbaren Objekt (wie einem Windows Form) behandelt werden.Kann .NET 3/4 Ereignisse binär de/serialisieren?

Aufgrund der Art und Weise, wie VB.NET Ereignisse implementiert, werden beim Serialisieren eines Objekts auch seine Ereignisse serialisiert (da Ereignisse tatsächlich mithilfe verdeckter Multicast-Delegatfelder implementiert werden). Ein Nebeneffekt davon ist, dass jedes Objekt, das Ereignisse behandelt, die von dem serialisierten Objekt ausgelöst werden, als Teil des Objektgraphen betrachtet wird und auch serialisiert wird.

könnten einige Abhilfen gefunden werden, benutzerdefinierte Serialisierung implementieren oder Delegierten statt Ereignisse mit:

jedoch keiner von ihnen die Autoren und Nutzer scheint vollständig zu befriedigen.

Kann .NET 3/4 dieses Problem lösen?

+3

Dieses Problem ist nicht spezifisch für VB.NET - es ist, wie .NET funktioniert. –

+2

Jedoch konnte C# ve mit "[Field: NonSerialized]" eine "flexiblere" Lösung finden. Zumindest gibt es keinen besonderen Bedarf, zusätzlichen Hilfscode zu schreiben, um das Problem zu lösen. – serhio

+0

@serhio: funktioniert dieses Attribut nicht auch VB? Warum nicht? Ich spreche nicht von 'WithEvents'. –

Antwort

3

Ereignisse werden durch die Erstellung eines Delegiertenmitglieds behandelt. Wenn Sie dieses Mitglied explizit selbst definieren, sollten Sie das Attribut NonSerialized hinzufügen können. See this thread for a reference.

Zum Beispiel:

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 
+0

Danke für die Syntax. Ich glaube nicht, dass ich jemals die 'RaiseEvent'-Syntax gesehen habe. –

Verwandte Themen