Ich fand, dass viele Leute das gleiche Problem haben, aber ich habe nicht gefunden, wie man es repariert.Fehler beim Serialisieren der Klasse, die List (Of OtherClass) enthält
Angenommen, ich habe 2 Klassen Employee
und Department
Mitarbeiter
Imports System.ComponentModel
Public Class Employee
Public Property Name As String
Public Property LastName As String
Public Property MotherName As String
Public Sub New(ByVal str1, ByVal str2, ByVal str3)
Name = str1
LastName = str2
MotherName = str3
End Sub
End Class
Abteilung Klasse
Public Class Department
Public Property Employees As List(Of Employee)
Public Sub New()
Employees = New List(Of Employee)
End Sub
Public Sub WriteToXml(ByVal strXmlFilePath As String,
Optional ByVal encrypted As Boolean = False)
Dim xs As New Serialization.XmlSerializer(GetType(Department))
Dim sr As New StringWriter
Dim strObject As String = String.Empty
xs.Serialize(sr, Me)
If encrypted Then
Dim wrapper As Simple3Des = New Simple3Des("123")
strObject = wrapper.EncryptData(sr.ToString)
Else
strObject = sr.ToString
End If
Using sw As New StreamWriter(strXmlFilePath)
sw.Write(strObject)
sw.Close()
End Using
End Sub
Public Sub ReadFromXml(ByVal strXmlFilePath As String,
Optional ByVal encrypted As Boolean = False)
Dim xs As New Serialization.XmlSerializer(GetType(Department))
Dim strObject As String = String.Empty
Dim micResult As New Department
Using sr As New StreamReader(strXmlFilePath)
strObject = sr.ReadToEnd
If encrypted Then
Dim wrapper As Simple3Des = New Simple3Des("123")
strObject = wrapper.DecryptData(strObject)
End If
sr.Close()
End Using
micResult = DirectCast(xs.Deserialize(New StringReader(strObject)), Department)
Me.Employees.AddRange(micResult.Employees)
micResult.Dispose()
End Sub
Wenn ich den folgenden Code lief
Dim m As New Employee("A", "B", "C")
Dim m1 As New Employee("D", "E", "F")
Dim ml1 As New Department
Dim ml2 As New Department
ml1.Employees.Add(m)
ml1.Employees.Add(m1)
ml1.WriteToXml("1.xml")
bekam ich eine Ausnahme auf ml1.WriteToXml("1.xml")
Es wurde ein Fehler Typ reflektieren 'SerializerTest.Department'
Das Problem ist, dass Department
Klasse ein List(of Employee)
enthält gefunden viele Artikel sprechen über dieses Problem, aber ich weiß nicht, wie ich das erreichen soll.
Sie brauchen nicht die 'Serializable' Attribut, wenn Sie nur mit XML-Serialisierung zu tun. Es wird für die binäre Serialisierung verwendet. –
Diese Mitarbeiterklasse ist nicht serialisierbar, da sie kein einfaches ctor hat, es gibt keinen Grund in * dem *, das Departement zu serialisieren - sondern nur die Mitarbeiterliste zu serialisieren, wenn es Dept-Requisiten (wie zB einen Namen) gibt um ein inneres Objekt zu erstellen und die Elemente zu mir zu kopieren. Machen Sie es einfach zu einer Shared-Methode, die das Department-Objekt zurückgibt ... und ein CrytoStream könnte besser/einfacher sein als diese Crypto-Methode. – Plutonix
@VisualVincent es ist auch für Designer-Serialisierung benötigt – Plutonix