Problem beim serialisieren (XML) eines Objekts...

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 23 Antworten in diesem Thema. Der letzte Beitrag () ist von Rebecca82.

    Jo - suboptimale Benamung gebiert meist viel Wirrsal ;)

    Was du UserData nennst ist wohl eher ein Contact - dann nenne ihn auch so. Und ein Contact darf keine Liste weiterer Contacts enthalten. Ein Contact ist ein Contact und das ist seine Verantwortung (Concern) und gut ist.
    AppUser kann namentlich so bleiben, obwohl einfach User ja wohl auch reichen würde.
    Und AppUser enthält eine Liste von Contacts.
    Und enthält keine Liste weiterer AppUser.
    Und eine - hier noch garnet eingeführte, noch übergeordnete Klasse enthält eine Liste von AppUser. Also nochmal: Die Liste der AppUser darf nicht inne AppUser selbst drinne sein!

    Es wäre glaub viel einfacher für dich gewesen, hättest du dich gleich mit Datasetse beschäftigt - wieviele Tage murkste damit nu schon rum?
    Da hätte es ganz klar eine Tabelle User gegeben, und eine ihr untergeordnete Tabelle Contact und done und kein Missverständnis möglich.

    Das Dataset wäre dann die og. allen übergeordnete Klasse, die die Liste der User hält, und jeder User hat Verbindung zu allen seinen Contacts (nur zu seinen).

    ErfinderDesRades schrieb:

    Es wäre glaub viel einfacher für dich gewesen, hättest du dich gleich mit Datasetse beschäftigt - wieviele Tage murkste damit nu schon rum?
    Da hätte es ganz klar eine Tabelle User gegeben, und eine ihr untergeordnete Tabelle Contact und done und kein Missverständnis möglich.

    Das Dataset wäre dann die og. allen übergeordnete Klasse, die die Liste der User hält, und jeder User hat Verbindung zu allen seinen Contacts (nur zu seinen).

    Du hast Recht. Ich werde mal beginnen mich mit Datasets auseinander zu setzen. Das ist wohl wirklich am sinnvollsten für mein Vorhaben.
    Allerdings habe ich mich heute morgen nochmal hingesetzt und folgendes ausprobiert (schnell zum testen):

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports System.Xml.Serialization
    3. Public Class Form1
    4. Public Class User
    5. Public Username As String
    6. Public Password As String
    7. Public UserID As Integer
    8. Public Bankkonten As New List(Of Konto)
    9. Public Sub AddKonto(Bankkonto As Konto)
    10. Bankkonten.Add(Bankkonto)
    11. End Sub
    12. Public Sub DeleteBankkonto(Bankkonto As Konto)
    13. Dim Index As Integer = Bankkonten.IndexOf(Bankkonto)
    14. If Not Index = -1 Then
    15. Bankkonten.RemoveAt(Index)
    16. End If
    17. End Sub
    18. End Class
    19. Public Class Konto
    20. Public Kontonummer As Integer
    21. Public Bankleitzahl As Integer
    22. Public Bank As String
    23. End Class
    24. 'Benutzer speichern und laden
    25. Public Class SaveAndLoadManagement
    26. Shared Sub SaveXML(ByVal ApplicationUsers As List(Of User), ByVal Filename As String)
    27. Dim XML As New XmlSerializer(GetType(List(Of User)))
    28. Try
    29. Using FStream As New FileStream(Filename, FileMode.Create, FileAccess.Write)
    30. Try
    31. XML.Serialize(FStream, ApplicationUsers)
    32. FStream.Close()
    33. Catch ex As Exception
    34. MessageBox.Show(ex.Message,
    35. "Fehler beim Schreiben der Datei!",
    36. MessageBoxButtons.OK,
    37. MessageBoxIcon.Error)
    38. End Try
    39. End Using
    40. Catch ex As Exception
    41. MessageBox.Show(ex.Message,
    42. "Fehler beim Erzeugen/Öffnen der Datei!",
    43. MessageBoxButtons.OK,
    44. MessageBoxIcon.Error)
    45. End Try
    46. End Sub
    47. Shared Function LoadXML(ByVal Filename As String) As List(Of User)
    48. Dim XML As New XmlSerializer(GetType(List(Of User)))
    49. Dim ReturnValue As List(Of User)
    50. Try
    51. Using FStream As New FileStream(Filename, FileMode.Open, FileAccess.Read)
    52. Try
    53. ReturnValue = CType(XML.Deserialize(FStream), List(Of User))
    54. FStream.Close()
    55. Return ReturnValue
    56. Catch ex As Exception
    57. MessageBox.Show("Benutzer-Datenbank ist womöglich beschädigt!" & vbNewLine &
    58. "Es konnten keine Benutzer geladen werden!" & vbNewLine &
    59. "Es wird eine neue Benutzer-Datenbank erstellt.",
    60. "Fehler in der Benutzer-Datenbank!",
    61. MessageBoxButtons.OK,
    62. MessageBoxIcon.Error)
    63. FStream.Close()
    64. File.Delete(Filename)
    65. End Try
    66. End Using
    67. Catch ex As Exception
    68. MessageBox.Show(ex.Message,
    69. "Fehler beim Öffnen der Datei!",
    70. MessageBoxButtons.OK,
    71. MessageBoxIcon.Error)
    72. End Try
    73. Return Nothing
    74. End Function
    75. End Class
    76. Const Filename As String = "Benutzer.data"
    77. Private Benutzerliste As New List(Of User)
    78. Private Benutzer As New User
    79. Private Bankkonto As New Konto
    80. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    81. If File.Exists(Filename) Then
    82. Benutzerliste = SaveAndLoadManagement.LoadXML(Filename)
    83. End If
    84. 'Benutzer erstellen
    85. With Benutzer
    86. .Username = "Rebecca"
    87. .Password = "7nB%fG7z$X"
    88. .UserID = 1
    89. End With
    90. 'Benutzer in Liste speichern
    91. Benutzerliste.Add(Benutzer)
    92. 'Speichern
    93. SaveAndLoadManagement.SaveXML(Benutzerliste, Filename)
    94. End Sub
    95. Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
    96. If File.Exists(Filename) Then
    97. Benutzerliste = SaveAndLoadManagement.LoadXML(Filename)
    98. With Bankkonto
    99. .Kontonummer = 1234567
    100. .Bankleitzahl = 12345678
    101. .Bank = "Musterbank"
    102. End With
    103. 'Konto hinzufügen
    104. For Each Benutzer As User In Benutzerliste
    105. If Benutzer.Username = "Rebecca" Then
    106. Benutzer.AddKonto(Bankkonto)
    107. End If
    108. Next
    109. 'Speichern
    110. SaveAndLoadManagement.SaveXML(Benutzerliste, Filename)
    111. Else
    112. MessageBox.Show("Es wurden noch keine Benutzer angelegt!")
    113. End If
    114. End Sub
    115. End Class


    Das funktioniert auch und die XML-Datei sieht genau so aus wie ich will. :)

    XML-Quellcode

    1. <?xml version="1.0"?>
    2. <ArrayOfUser xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    3. <User>
    4. <Username>Rebecca</Username>
    5. <Password>7nB%fG7z$X</Password>
    6. <UserID>1</UserID>
    7. <Bankkonten>
    8. <Konto>
    9. <Kontonummer>1234567</Kontonummer>
    10. <Bankleitzahl>12345678</Bankleitzahl>
    11. <Bank>Musterbank</Bank>
    12. </Konto>
    13. </Bankkonten>
    14. </User>
    15. </ArrayOfUser>


    @ErfinderDesRades: Ich habe es dementsprechend geändert. Also so wie du es vorgeschlagen hast. :)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Rebecca82“ ()

    schlecht benamt und überkompliziert.

    Data ist in Wirklichkeit ein Konto - das soll auch so heissen.
    Und die Property User.Banken muss User.Konten heißen.
    Und die Methoden AddBank(), RemoveBank() sind folglich auch falsch benamt (es sind Konten!) und v.a. überflüssig, denn eine einfache List(Of T) hat bereits Add/Remove. So kannst du zB so korrigieren und reduzieren:

    VB.NET-Quellcode

    1. Public Class User
    2. Public Username As String
    3. Public Password As String
    4. Public UserID As Integer
    5. Public Konten As New List(Of Konto)
    6. End Class
    7. Public Class Konto
    8. Public Kontonummer As Integer
    9. Public Bankleitzahl As Integer
    10. Public Bank As String
    11. End Class
    Und lass unnütze Kommentare weg, wie etwa dass User die Benutzer-Klasse sei. So bischen englisch darf man dem Leser zumuten.

    UserManagement ist komplett unnütz - eine List(Of User) tuts ebenso.