2016-08-20 3 views
0

Ich versuche, eine Liste von Objekten in Datei zu speichern, aber eine Ausnahme ausgelöst wird in den Prozess. Das ist meine Objektklasse:Der Versuch, eine Liste von Objekten zu serialisieren schlägt fehl

<Serializable()> 
Public Class FavoritesObject 
    Private Dset As DataSet 
    Private Name As String 
    Private BSource1 As BindingSource 
    Private Bsource2 As BindingSource 

    Public Sub New() 
     ' Leave fields empty. 
    End Sub 

    Public Sub New(ByVal datset As DataSet, ByVal thename As String, ByVal binsource1 As BindingSource, ByVal binsource2 As BindingSource) 
     Dset = datset 
     Name = thename 
     BSource1 = binsource1 
     binsource2 = binsource2 
    End Sub 

    Public Property Dataset1 As DataSet 
     Get 
      Return Dset 
     End Get 
     Set(ByVal value As DataSet) 
      Dset = value 
     End Set 
    End Property 

    Public Property FavoriteName As String 
     Get 
      Return Name 
     End Get 
     Set(ByVal value As String) 
      Name = value 
     End Set 
    End Property 

    Public Property BindingSource1 As BindingSource 
     Get 
      Return BSource1 
     End Get 
     Set(ByVal value As BindingSource) 
      BSource1 = value 
     End Set 
    End Property 

    Public Property BindingSource2 As BindingSource 
     Get 
      Return Bsource2 
     End Get 
     Set(ByVal value As BindingSource) 
      Bsource2 = value 
     End Set 
    End Property 
End Class 

Hier meine Funktionen für die Serialisierung und Deserialisierung sind:

Public Sub WriteToBinaryFile(serializationFile As String, List As List(Of FavoritesObject)) 
    Using stream As Stream = File.Open(serializationFile, FileMode.Create) 
     Dim bformatter = New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter() 
     bformatter.Serialize(stream, List) 
    End Using 
End Sub 

Public Function ReadFromBinaryFile(serializationFile As String) 
    Using stream As Stream = File.Open(serializationFile, FileMode.Open) 
     Dim bformatter = New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter() 
     Dim favorites As List(Of FavoritesObject) = DirectCast(bformatter.Deserialize(stream), List(Of FavoritesObject)) 
     Return favorites 
    End Using 
End Function 

Wenn ich versuche, meine Liste der Objekte serialisieren ich die folgende Ausnahme ausgelöst erhalten:

Eine nicht behandelte Ausnahme vom Typ 'System.Runtime.Serialization.SerializationException' ist in mscorlib.dll aufgetreten. Weitere Informationen: Geben Sie 'System.Windows.Forms.BindingSource' in Assembly 'System ein. Windows.Forms, Version = 4.0.0.0, Kultur = neutral, PublicKeyToken = b77a5c561934e089 'ist nicht als serialisierbar gekennzeichnet.

Ich bin mit Serialisierung wirklich nicht vertraut und versuche es zu lernen. Kann jemand bitte etwas Licht auf mein Problem werfen und eine mögliche Lösung?

+0

Ist das nicht offensichtlich von der Ausnahmemeldung, dass 'BindingSource' nicht soll (und nicht kann) serialisiert werden –

+2

Die Antwort unten gibt die direkte technische Lösung. Das größere Problem ist Ihr Entwurf, eine Domänenentität sollte keinen UI- oder Persistenzcode enthalten. –

+0

@HenkHolterman Dachte nicht, danke. Im Nachhinein gab es keinen Grund, sie so zu lagern, da sie im laufenden Betrieb erstellt werden können. –

Antwort

1

Nach dem Lesen ein bisschen mehr fand ich diese Lösung: Preventing serialization of properties in VB.NET

Dies ist der Code, der die Seria zu stoppen scheint lisierung der Bindungs ​​Quellen:

<NonSerialized()> 
Private BSource1 As BindingSource 
<NonSerialized()> 
Private Bsource2 As BindingSource 
+0

'Imports System.Xml.Serialization' - Was ??? –

+1

Bearbeitet. Versehentlich eingeschlossen das. –

+0

Die wahre Antwort hier ist jedoch, die Bindungsquellen vollständig aus der Klasse zu entfernen, da sie nicht auf diese Weise gespeichert werden müssen. –

0

Sie haben die Eigenschaften von Typ BindingSource, die nicht serialisierbar ist, Sie das XmlIgnore Attribut auf die Eigenschaften hinzuzufügen haben, die nicht serialisierbar sind, wie BindingSource2 und BindingSource1

wird der Code

sein
<Serializable()> 
Public Class FavoritesObject 
Private Dset As DataSet 
Private Name As String 
Private BSource1 As BindingSource 
Private Bsource2 As BindingSource 

Public Sub New() 
    ' Leave fields empty. 
End Sub 

Public Sub New(ByVal datset As DataSet, ByVal thename As String, ByVal binsource1 As BindingSource, ByVal binsource2 As BindingSource) 
    Dset = datset 
    Name = thename 
    BSource1 = binsource1 
    binsource2 = binsource2 
End Sub 

Public Property Dataset1 As DataSet 
    Get 
     Return Dset 
    End Get 
    Set(ByVal value As DataSet) 
     Dset = value 
    End Set 
End Property 

Public Property FavoriteName As String 
    Get 
     Return Name 
    End Get 
    Set(ByVal value As String) 
     Name = value 
    End Set 
End Property 

<NonSerialized()> 
Public Property BindingSource1 As BindingSource 
    Get 
     Return BSource1 
    End Get 
    Set(ByVal value As BindingSource) 
     BSource1 = value 
    End Set 
End Property 

<NonSerialized()> 
Public Property BindingSource2 As BindingSource 
    Get 
     Return Bsource2 
    End Get 
    Set(ByVal value As BindingSource) 
     Bsource2 = value 
    End Set 
End Property 
End Class 
+1

Tatsächlich wird das benötigte Attribut 'NotSerialized' genannt und sollte auf Unterstützungsfelder gesetzt werden. –

+0

Lesen Sie hier: https://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlignoreattribute(v=vs.110).aspx?cs-save-lang=1&cs-lang=vb#code -snippet-1 –

+1

Negativ. Hier: https://msdn.microsoft.com/en-us/library/system.nonserializedattribute(v=vs.110).aspx –

Verwandte Themen