2011-08-03 9 views
0

オブジェクトをシリアル化しようとしましたが、以下のように例外をスローします。私はそれがシリアル化しようとするクラスのイベントにサブシブするUserControlもシリアル化しようとしていると仮定します。これは望ましくない。どうすればイベントのシリアライズを避けることができますか? (できるだけ簡単に)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

あなたのルーチンに渡しているあなたのオブジェクトが直列ではないことが表示されます。このメソッドにあなたのusercontrolを渡していますか?もしそうであれば、直列化したいものを渡す必要がありますか?それ以外の場合は、オブジェクトの[Searilzable]属性を使用して、それが機能するかどうかを確認してください。

0

1つのオプションは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

関連する問題