2011-08-03 69 views
0

我試圖序列化一個對象,它會拋出一個異常,如下所示。我假設它試圖序列化用戶控件,該用戶控件包含到我嘗試序列化的類的事件中。這是不希望的。那麼如何避免序列化事件呢? (儘可能容易)SerializationException,如何避免UserControl使用要序列化的事件?

SerializationException發生:在大會 「System.Windows.Forms的

類型 'System.Windows.Forms.UserControl',版本= 2.0.0.0,文化=中性 PublicKeyToken = b77a5c561934e089'未標記爲可序列化。

Public Sub SendData(ByVal obj As Object) 

    If Client.Connected Then 
     Try 
      Dim ns As NetworkStream = Client.GetStream() 

      Dim bf = New BinaryFormatter() 
      Dim ms = New MemoryStream() 

      bf.Serialize(ms, obj) ' < Exception here 

回答

2

如何避免序列化的事件?

解決方法是用[NonSerialized]屬性標記類中的事件處理函數。

0

看來要傳遞到你的日常你的對象不是序列化。你是否將你的用戶控件傳遞給這個方法?如果是這樣,你將需要傳遞你想要的序列化,我認爲它可能是內部的數據結構?否則,請嘗試在對象上使用[Searilzable]屬性,看看是否有效。

0

一個選項是實現ISerializable並且只能序列化你想要的東西。

另一個可用於C#的選項(我不確定VB)是做一個自定義的添加/刪除代碼。

[NonSerialized] // prevents the m_changed field from being serialized. 
private EventHandler m_changed; 

public event Changed 
{ 
    add 
    { 
    m_changed += value; 
    } 
    remove 
    { 
    m_changed -= value; 
    } 
} 
0

VB.NET不會允許事件的屬性。由於VB.NET實現事件的方式,當您序列化一個對象時,它的事件也會被序列化,因爲事件實際上是使用隱藏的多播委託字段實現的。下面是如何在vb中序列化期間刪除處理程序的示例:

 <NonSerialized()> _ 
    Private PropertyChangedHandlers As New Generic.List(Of PropertyChangedEventHandler) 

    ''' <summary> 
    ''' stores parameter of event in a local nonserializable variable 
    ''' </summary> 
    ''' <remarks></remarks> 
    Public Custom Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged 
    AddHandler(ByVal value As PropertyChangedEventHandler) 
     If PropertyChangedHandlers Is Nothing Then 
      PropertyChangedHandlers = New Generic.List(Of PropertyChangedEventHandler)() 
     End If 
     PropertyChangedHandlers.Add(value) 
    End AddHandler 

    RemoveHandler(ByVal value As PropertyChangedEventHandler) 
     If value Is Nothing Or PropertyChangedHandlers Is Nothing Then 
      Return 
     End If 

     PropertyChangedHandlers.Remove(value) 
    End RemoveHandler 

     RaiseEvent(ByVal sender As Object, ByVal e As PropertyChangedEventArgs) 
      Dim pos As Int32 
      Dim count As Int32 
      Dim Element As PropertyChangedEventHandler 
      If Me.PropertyChangedHandlers IsNot Nothing Then 
       count = PropertyChangedHandlers.Count 
       If count > 0 Then 
        For pos = (count - 1) To 0 Step -1 
         Element = PropertyChangedHandlers(pos) 
         Try 
          Element.Invoke(sender, e) 
         Catch ex As Exception 
          'Ignore any error generated 
         End Try 
        Next 
       End If 
      End If 
     End RaiseEvent 
    End Event 
+0

我還認爲如此,因爲我讀取了相同的其他位置,但它似乎起作用。它編譯並刪除了我有的異常。 – bretddog

相關問題