2010-02-25 6 views
7

En .NET (al menos < = 2) existe un problema al serializar objetos que generan eventos cuando esos eventos son manejados por un objeto no serializable (como Windows Form).Do .NET 3/4 permite que los eventos sean binarios De/Serializados?

Debido a la forma en que VB.NET implementa eventos, al serializar un objeto, sus eventos se serializan también (porque los eventos se implementan realmente usando campos delegados de multidifusión ocultos). Un efecto secundario de esto es que cualquier objeto que maneje eventos generados por el objeto que se está serializando se considerará parte del gráfico del objeto y también se serializará.

Algunas soluciones se puede conocer, implementar serialización personalizada o el uso de los delegados en lugar de los acontecimientos:

Sin embargo, ninguno de ellos parece satisfacer por completo a los autores y los usuarios.

¿El .NET 3/4 resuelve este problema?

+3

Este problema no es específico de VB.NET - es cómo funciona .NET. –

+2

Sin embargo, con C# ve podría encontrar una solución más "flexible" usando '[Field: NonSerialized]'. Al menos, no hay una necesidad especial de escribir un código complementario de ayuda para resolver el problema. – serhio

+0

@serhio: ¿ese atributo tampoco funciona VB? Por qué no? No estoy hablando de 'WithEvents'. –

Respuesta

3

Los eventos se manejan mediante la creación de un miembro delegado. Si define explícitamente este miembro usted mismo, debería poder agregarle el atributo NonSerialized. See this thread for a reference.

Por ejemplo:

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

Gracias por la sintaxis. No creo haber visto la sintaxis 'RaiseEvent'. –

Cuestiones relacionadas