2010-02-25 4 views
7

In .NET (almeno < = 2) c'è un problema serializzazione di oggetti che sollevano eventi quando questi eventi sono gestiti da un oggetto non serializzabile (come un Windows Form).Do .NET 3/4 consente agli eventi di essere binari De/serializzati?

A causa del modo in cui VB.NET implementa gli eventi, quando si serializza un oggetto, anche gli eventi vengono serializzati (poiché gli eventi vengono effettivamente implementati utilizzando campi di delega multicast nascosti). Un effetto collaterale di ciò è che qualsiasi oggetto che gestisce gli eventi generati dall'oggetto serializzato sarà considerato parte del grafico dell'oggetto e verrà anch'esso serializzato.

alcune soluzioni potrebbe essere trovato, l'implementazione serializzazione personalizzata o utilizzando i delegati al posto di eventi:

Tuttavia nessuno di loro sembra soddisfare completamente gli autori e gli utenti.

Condivide la .NET 3/4 risolvere questo problema?

+3

Questo problema non è specifico per VB.NET - è come .NET funziona. –

+2

Tuttavia, con C# ve poteva trovare una soluzione più "flessibile" utilizzando '[Campo: NonSerialized]'. Almeno, non è necessario scrivere codice di supporto supplementare per risolvere il problema. – serhio

+0

@serhio: questo attributo non funziona anche su VB? Perchè no? Non sto parlando di "WithEvents". –

risposta

3

eventi vengono gestiti dalla creazione di un membro delegato. Se si definisce in modo esplicito a questo utente soli, si dovrebbe essere in grado di aggiungere l'attributo NonSerialized ad esso. See this thread for a reference.

Ad esempio:

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

Grazie per la sintassi. Non penso di aver mai visto la sintassi 'RaiseEvent'. –

Problemi correlati