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.

    Problem beim serialisieren (XML) eines Objekts...

    Hallo zusammen :) ,

    ich hätte mal wieder ein Problemchen das mich wirklich nervt.
    Ich versuche gerade ein kleines Programm zu schreiben, bei dem man später verschiedene Benutzer anlegen kann. Die jeweiligen Benutzer sollen dann verschiedene Daten darin speichern können. Zum testen habe ich es erstmal so geschrieben, dass man als eingeloggter Benutzer lediglich Adressdaten speichern kann.
    Da ich mich mit Datasets nicht auskenne, weil ich mich noch nie damit auseinander gesetzt habe (es aber in naher Zukunft vor habe), möchte ich das Ganze erstmal so umsetzen, dass die jeweiligen Benutzer mit ihren jeweiligen Daten komplett in nur einer Datei geschrieben werden. Auch wenn es so vielleicht wenig Sinn macht, würde ich das gerne so umsetzen.

    Nun zu meinem Problem: Wenn ich einen neuen Benutzer registriere, sollte die XML-Datei eigentlich so aussehen:

    XML-Quellcode

    1. <?xml version="1.0"?>
    2. <AppUser xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    3. <AllUsers>
    4. <AppUser>
    5. <AppUsername>Rebecca</AppUsername>
    6. <AppUserPasswordHash>CF68E063B433FBAD3F4BE5F9CACC38ED0D84EDDF2A05D0F9D961A0183FFD3B9E</AppUserPasswordHash>
    7. <AppUserID>1</AppUserID>
    8. <AppUserGUID>609c537c-86d0-42d3-8995-d13c52798651</AppUserGUID>
    9. <AppUserData>
    10. <AllAdressData />
    11. </AppUserData>
    12. </AppUser>
    13. </AllUsers>
    14. </AppUser>

    Stattdessen wird aber folgendes rein geschrieben:

    XML-Quellcode

    1. <?xml version="1.0"?>
    2. <AppUser xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    3. <AllUsers>
    4. <AppUser>
    5. <AllUsers /> <- FALSCH!!!
    6. <AppUsername>Rebecca</AppUsername>
    7. <AppUserPasswordHash>CF68E063B433FBAD3F4BE5F9CACC38ED0D84EDDF2A05D0F9D961A0183FFD3B9E</AppUserPasswordHash>
    8. <AppUserID>1</AppUserID>
    9. <AppUserGUID>609c537c-86d0-42d3-8995-d13c52798651</AppUserGUID>
    10. <AppUserData>
    11. <AllAdressData />
    12. </AppUserData>
    13. </AppUser>
    14. </AllUsers>
    15. <AppUserData> <- FALSCH!!!
    16. <AllAdressData /> <- FALSCH!!!
    17. </AppUserData> <- FALSCH!!!
    18. </AppUser>

    Adressdaten der jeweiligen Benutzer an der richtigen Stellen eintragen funktioniert soweit auch. Nur verstehe ich nicht, wieso die o.g. Fehler auftreten.
    Jetzt noch ein Beispiel mit zwei Benutzern:

    XML-Quellcode

    1. <?xml version="1.0"?>
    2. <AppUser xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    3. <AllUsers>
    4. <AppUser>
    5. <AllUsers /> <- FALSCH!!!
    6. <AppUsername>Rebecca</AppUsername>
    7. <AppUserPasswordHash>CF68E063B433FBAD3F4BE5F9CACC38ED0D84EDDF2A05D0F9D961A0183FFD3B9E</AppUserPasswordHash>
    8. <AppUserID>1</AppUserID>
    9. <AppUserGUID>609c537c-86d0-42d3-8995-d13c52798651</AppUserGUID>
    10. <AppUserData>
    11. <AllAdressData />
    12. </AppUserData>
    13. </AppUser>
    14. <AppUser>
    15. <AllUsers /> <- FALSCH!!!
    16. <AppUsername>Rebecca2</AppUsername>
    17. <AppUserPasswordHash>13D753335C627AABF242C54AF360F8202333650081C609066AC5420F423D47D1</AppUserPasswordHash>
    18. <AppUserID>2</AppUserID>
    19. <AppUserGUID>8b05a2d9-5a69-4b3c-a928-2b358164cd8a</AppUserGUID>
    20. <AppUserData>
    21. <AllAdressData />
    22. </AppUserData>
    23. </AppUser>
    24. </AllUsers>
    25. <AppUserData> <- FALSCH!!!
    26. <AllAdressData /> <- FALSCH!!!
    27. </AppUserData> <- FALSCH!!!
    28. </AppUser>

    Hier noch ein Beispiel mit zwei Benutzern und den jweiligen Adressdaten:

    XML-Quellcode

    1. <?xml version="1.0"?>
    2. <AppUser xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    3. <AllUsers>
    4. <AppUser>
    5. <AllUsers /> <- FALSCH!!!
    6. <AppUsername>Rebecca</AppUsername>
    7. <AppUserPasswordHash>CF68E063B433FBAD3F4BE5F9CACC38ED0D84EDDF2A05D0F9D961A0183FFD3B9E</AppUserPasswordHash>
    8. <AppUserID>1</AppUserID>
    9. <AppUserGUID>609c537c-86d0-42d3-8995-d13c52798651</AppUserGUID>
    10. <AppUserData>
    11. <AllAdressData>
    12. <UserData>
    13. <Prename>Max</Prename>
    14. <Surname>Mustermann</Surname>
    15. <Street>Musterstraße 111</Street>
    16. <Postcode>77777</Postcode>
    17. <City>Musterstadt</City>
    18. <State>Musterstaat</State>
    19. <Country>Musterland</Country>
    20. <AllAdressData /> <- FALSCH!!!
    21. </UserData>
    22. </AllAdressData>
    23. </AppUserData>
    24. </AppUser>
    25. <AppUser>
    26. <AllUsers /> <- FALSCH!!!
    27. <AppUsername>Rebecca2</AppUsername>
    28. <AppUserPasswordHash>13D753335C627AABF242C54AF360F8202333650081C609066AC5420F423D47D1</AppUserPasswordHash>
    29. <AppUserID>2</AppUserID>
    30. <AppUserGUID>8b05a2d9-5a69-4b3c-a928-2b358164cd8a</AppUserGUID>
    31. <AppUserData>
    32. <AllAdressData>
    33. <UserData>
    34. <Prename>Testvorname</Prename>
    35. <Surname>Testnachname</Surname>
    36. <Street>Teststraße 111</Street>
    37. <Postcode>77777</Postcode>
    38. <City>Teststadt</City>
    39. <State>Teststaat</State>
    40. <Country>Testland</Country>
    41. <AllAdressData /> <- FALSCH!!!
    42. </UserData>
    43. </AllAdressData>
    44. </AppUserData>
    45. </AppUser>
    46. </AllUsers>
    47. <AppUserData> <- FALSCH!!!
    48. <AllAdressData /> <- FALSCH!!!
    49. </AppUserData> <- FALSCH!!!
    50. </AppUser>

    Hier mal der relevante Code-Ausschnitt der AppUser-Klasse:

    VB.NET-Quellcode

    1. 'Benutzer-Klasse
    2. <System.Serializable()>
    3. Public Class AppUser
    4. Private Username As String
    5. Private UserPasswordHash As String
    6. Private UserID As String
    7. Private UserGUID As String
    8. 'Zum Speichern von Benutzerdaten
    9. Private UserData As New UserData
    10. 'Konstruktoren
    11. 'Parameterloser Konstruktor
    12. Public Sub New()
    13. End Sub
    14. 'Konstruktor
    15. Public Sub New(ByVal AUN As String, ByVal AUPH As String, ByVal AUID As String, ByVal AUGUID As String)
    16. 'Me.New()
    17. AppUsername = AUN
    18. AppUserPasswordHash = AUPH
    19. AppUserID = AUID
    20. AppUserGUID = AUGUID
    21. End Sub
    22. 'Eine neue Liste zum Speichern aller Benutzer
    23. Private ApplicationUsers As New List(Of AppUser)
    24. '--------------------------------- Eigenschaften ---------------------------------
    25. 'Liste aller Benutzer
    26. Public Property AllUsers() As List(Of AppUser)
    27. Get
    28. Return ApplicationUsers
    29. End Get
    30. Set(value As List(Of AppUser))
    31. ApplicationUsers = value
    32. End Set
    33. End Property
    34. 'Benutzer
    35. Public Property AppUsername() As String
    36. Get
    37. Return Username
    38. End Get
    39. Set(value As String)
    40. Username = value
    41. End Set
    42. End Property
    43. 'Gehashtes Passwort
    44. Public Property AppUserPasswordHash() As String
    45. Get
    46. Return UserPasswordHash
    47. End Get
    48. Set(value As String)
    49. UserPasswordHash = value
    50. End Set
    51. End Property
    52. 'Benutzer Identifikationsnummer
    53. Public Property AppUserID() As String
    54. Get
    55. Return UserID
    56. End Get
    57. Set(value As String)
    58. UserID = value
    59. End Set
    60. End Property
    61. 'Benutzer GUID
    62. Public Property AppUserGUID() As String
    63. Get
    64. Return UserGUID
    65. End Get
    66. Set(value As String)
    67. UserGUID = value
    68. End Set
    69. End Property
    70. 'Benutzerdaten
    71. Public Property AppUserData() As UserData
    72. Get
    73. Return UserData
    74. End Get
    75. Set(value As UserData)
    76. UserData = value
    77. End Set
    78. End Property
    79. '--------------------------------- Methoden ---------------------------------
    80. 'Benutzer hinzufügen
    81. Public Sub AddUser(ByVal Username As String, ByVal UserPasswordHash As String, ByVal UserID As String, ByVal UserGUID As String)
    82. AllUsers.Add(New AppUser(Username, UserPasswordHash, UserID, UserGUID))
    83. End Sub
    84. 'Benutzer löschen
    85. Public Sub RemoveUser(ByVal User As AppUser)
    86. AllUsers.Remove(User)
    87. End Sub
    88. .
    89. .
    90. .

    ...und für die Adressdaten:

    VB.NET-Quellcode

    1. 'Adressdaten-Klasse
    2. Public Class UserData
    3. 'Adressdaten-Struktur
    4. Public Prename As String
    5. Public Surname As String
    6. Public Street As String
    7. Public Postcode As String
    8. Public City As String
    9. Public State As String
    10. Public Country As String
    11. 'Parameterloser Konstruktor
    12. Public Sub New()
    13. End Sub
    14. 'Konstruktor
    15. Public Sub New(ByVal PName As String,
    16. ByVal SName As String,
    17. ByVal StName As String,
    18. ByVal PCode As String,
    19. ByVal CName As String,
    20. ByVal SteName As String,
    21. ByVal CyName As String)
    22. Prename = PName
    23. Surname = SName
    24. Street = StName
    25. Postcode = PCode
    26. City = CName
    27. State = SteName
    28. Country = CyName
    29. End Sub
    30. 'Eine neue Liste zum Speichern aller Adressen
    31. Private UserAdresses As New List(Of UserData)
    32. 'Liste aller Adressdaten zurückgeben oder setzen
    33. Public Property AllAdressData() As List(Of UserData)
    34. Get
    35. Return UserAdresses
    36. End Get
    37. Set(value As List(Of UserData))
    38. UserAdresses = value
    39. End Set
    40. End Property
    41. 'Adressdaten hinzufügen
    42. Public Sub AddAdress(ByVal Prename As String,
    43. ByVal Surname As String,
    44. ByVal Street As String,
    45. ByVal PostCode As String,
    46. ByVal City As String,
    47. ByVal State As String,
    48. ByVal Country As String)
    49. AllAdressData.Add(New UserData(Prename, Surname, Street, PostCode, City, State, Country))
    50. End Sub
    51. 'Adressdaten löschen
    52. Public Sub RemoveAdress(Item As UserData)
    53. AllAdressData.Remove(Item)
    54. End Sub
    55. End Class


    Was ist hier falsch? Könnt ihr mir bitte helfen? :/
    Hallo @ErfinderDesRades - Deserialisierung funktioniert einwandfrei. Ich hatte mich nur gewundert wieso das so komisch in die XML-Datei reingeschrieben wird. Aber letztendlich funktioniert es ja. :) Also wenn du meinst das es so okay ist, denke ich mal dann kann man das so lassen.
    Auf jeden Fall danke ich dir vielmals für deine Antwort. ;)
    doch, das bringt vor allem Sicherheit im Code, denn nun kann von aussen niemand da mehr eine neue List(Of UserData) zuweisen.
    ich meine so:

    VB.NET-Quellcode

    1. Private readonly UserAdresses As New List(Of UserData)
    2. Public readonly Property AllAdressData() As List(Of UserData)
    3. Get
    4. Return UserAdresses
    5. End Get
    6. End Property
    naja - vlt. gehts dann auch garnimmer, bin mir grad nicht sicher. Bin nicht so der Serialisierer ;)
    Ach so, ja. Verzeihung - das es so sicherer ist, gebe ich dir vollkommen Recht. Deswegen habe ich es auch gleich dementsprechend geändert und auch so gelassen. Auch hierfür Dankeschön. :) Mein voriger Post bezog sich nur auf die Art und Weise wie die Daten in die XML-Datei geschrieben werden. Da hat sich trotz der Änderung der Property auf ReadOnly leider nichts verändert. Die komischen XML-Tags werden nach wie vor rein geschrieben. Das meinte ich mit (nichts gebracht). ;)
    @petaod: Hallo :) , habe erst heute deinen Post gelesen. Der Eintrag ist schon logisch. Aber ich dachte eben, dass es irgendwie möglich ist den Inhalt der XML-Datei folgendermaßen aussehen zu lassen:

    XML-Quellcode

    1. <?xml version="1.0"?>
    2. <AppUser xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    3. <AllUsers>
    4. <AppUser>
    5. <AppUsername>Rebecca</AppUsername>
    6. <AppUserPasswordHash>CF68E063B433FBAD3F4BE5F9CACC38ED0D84EDDF2A05D0F9D961A0183FFD3B9E</AppUserPasswordHash>
    7. <AppUserID>1</AppUserID>
    8. <AppUserGUID>609c537c-86d0-42d3-8995-d13c52798651</AppUserGUID>
    9. <AppUserData>
    10. <AllAdressData />
    11. </AppUserData>
    12. </AppUser>
    13. </AllUsers>
    14. </AppUser>

    So wäre es für mich am logischsten. Warum?
    Weil das Benutzer-Objekt eine Liste aller Benutzer (AllUsers) enthält und jeder Benutzer wiederum eine eigene Liste aller Adressdaten (AllAdressData) besitzt.

    Doch stattdessen sieht obere (Wunsch XML-Datei) folgendermaßen aus:

    XML-Quellcode

    1. <?xml version="1.0"?>
    2. <AppUser xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    3. <AllUsers>
    4. <AppUser>
    5. <AllUsers /> <- Überflüssig
    6. <AppUsername>Rebecca</AppUsername>
    7. <AppUserPasswordHash>CF68E063B433FBAD3F4BE5F9CACC38ED0D84EDDF2A05D0F9D961A0183FFD3B9E</AppUserPasswordHash>
    8. <AppUserID>1</AppUserID>
    9. <AppUserGUID>609c537c-86d0-42d3-8995-d13c52798651</AppUserGUID>
    10. <AppUserData>
    11. <AllAdressData />
    12. </AppUserData>
    13. </AppUser>
    14. </AllUsers>
    15. <AppUserData> <- Überflüssig
    16. <AllAdressData /> <- Überflüssig
    17. </AppUserData> <- Überflüssig
    18. </AppUser>

    Verstehst du was ich meine?

    Rebecca82 schrieb:

    So wäre es für mich am logischsten.
    Ist am logischsten logischer als logisch? :D
    Was hindert Dich daran, diese Einträge einfach zu ignorieren?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Rebecca82 schrieb:

    dass es doof aussieht.
    Es hat durchaus einen Sinn, denn wenn Du von Hand da was eintragen möchtest, ist der Rumpf schon da.
    Sieh Dir mal die Projekt-Konfig-Dateien an, da ist auch einiges solch Zeugs drin.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich hab den Code mal auf das wichtigste reduziert. Beachte besonders die nicht auskommentierten Zeilen.

    VB.NET-Quellcode

    1. Public Class AppUser
    2. 'Private Username As String
    3. 'Private UserPasswordHash As String
    4. 'Private UserID As String
    5. 'Private UserGUID As String
    6. 'Private UserData As New UserData
    7. 'Public Property AppUsername() As String
    8. 'Public Property AppUserPasswordHash() As String
    9. 'Public Property AppUserID() As String
    10. 'Public Property AppUserGUID() As String
    11. 'Public Property AppUserData() As UserData
    12. Private ApplicationUsers As New List(Of AppUser)
    13. Public Property AllUsers() As List(Of AppUser)
    14. Public Sub AddUser(ByVal Username As String, ByVal UserPasswordHash As String, ByVal UserID As String, ByVal UserGUID As String)
    15. AllUsers.Add(New AppUser(Username, UserPasswordHash, UserID, UserGUID))
    16. End Sub
    17. Public Sub RemoveUser(ByVal User As AppUser)
    18. AllUsers.Remove(User)
    19. End Sub
    20. End Class
    21. Public Class UserData
    22. 'Public Prename As String
    23. 'Public Surname As String
    24. 'Public Street As String
    25. 'Public Postcode As String
    26. 'Public City As String
    27. 'Public State As String
    28. 'Public Country As String
    29. Private UserAdresses As New List(Of UserData)
    30. Public Property AllAdressData() As List(Of UserData)
    31. Public Sub AddAdress(ByVal Prename As String,
    32. ByVal Surname As String,
    33. ByVal Street As String,
    34. ByVal PostCode As String,
    35. ByVal City As String,
    36. ByVal State As String,
    37. ByVal Country As String)
    38. AllAdressData.Add(New UserData(Prename, Surname, Street, PostCode, City, State, Country))
    39. End Sub
    40. Public Sub RemoveAdress(Item As UserData)
    41. AllAdressData.Remove(Item)
    42. End Sub
    43. End Class

    Die Klassen heißen AppUser und UserData. Das sind Einzahlen. Und sie haben die Informationen für jeweils eine Instanz z.B. des Users (Username, Id, etc.).
    Aber:
    Da sind auch noch Listen drin: Public Property AllUsers() As List(Of AppUser) und Public Property AllAdressData() As List(Of UserData)
    Also würde die Verwendung so aussehen:

    VB.NET-Quellcode

    1. Dim Niko As New AppUser("Niko", "asdf", 1, Guid.NewGuid)
    2. Dim Rebecca As New AppUser("Rebecca", "jklö", 2, Guid.NewGuid)
    3. Dim RodFromGermany As New AppUser("RodFromGermany", "qwertz", 3, Guid.NewGuid)
    4. Niko.AllUsers.Add(Rebecca)
    5. Rebecca.AllUsers.Add(RodFromGermany)
    6. 'Ähnlich mit UserData

    Das ist irgendwie verwirrend. Kann es sein, dass Du AllUsers statisch haben möchtest? Also nicht Niko.AllUsers.Add(...), sondern AppUser.AllUsers.Add(...).
    Denn so wie es jetzt ist, ist klar, dass bei der Serialisierung die leeren Listen daherkommen, weil die Klassen ja auch leere Listen beinhalten.
    Das macht nur Sinn, wenn User andere User untergeordnet haben sollen, aber ich denke nicht, dass das beabsichtigt war.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Hallo und Verzeihung für die verspätete Antwort. :)

    RodFromGermany schrieb:

    Es hat durchaus einen Sinn, denn wenn Du von Hand da was eintragen möchtest, ist der Rumpf schon da.

    Da gebe ich dir auch Recht. :) Aber schau dir nochmal bitte die XML an die ich gerne hätte:

    XML-Quellcode

    1. <?xml version="1.0"?>
    2. <AppUser xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    3. <AllUsers>
    4. <AppUser>
    5. <AppUsername>Rebecca</AppUsername>
    6. <AppUserPasswordHash>CF68E063B433FBAD3F4BE5F9CACC38ED0D84EDDF2A05D0F9D961A0183FFD3B9E</AppUserPasswordHash>
    7. <AppUserID>1</AppUserID>
    8. <AppUserGUID>609c537c-86d0-42d3-8995-d13c52798651</AppUserGUID>
    9. <AppUserData> <- ...
    10. <AllAdressData /> <- Hier ist der Rumpf ja auch enthalten
    11. </AppUserData> <- ...
    12. </AppUser>
    13. </AllUsers>
    14. </AppUser>


    Niko Ortner schrieb:


    Das ist irgendwie verwirrend. Kann es sein, dass Du AllUsers statisch haben möchtest? Also nicht Niko.AllUsers.Add(...), sondern AppUser.AllUsers.Add(...).

    Ich möchte das jeder User seine eigene Adressenliste hat, die er mit Daten füllen kann. Hier ein kurzes Beispiel zur Verdeutlichung:

    VB.NET-Quellcode

    1. 'Jetzt mal nur als Beispiel
    2. '--------------------------
    3. Const Filename As String = "Benutzer.dat" '<- Hier ist alles gespeichert (XML), Benutzer und jeweilige Adresslisten
    4. Dim ApplicationUsers As AppUser
    5. If File.Exists(Filename) Then
    6. ApplicationUsers = SaveAndLoadManagement.LoadXML(Filename) 'SaveAndLoadManagement ist die Klasse die ich zum (de)serialisieren geschrieben habe
    7. Else
    8. .
    9. .
    10. End If
    11. 'Wir gehen davon aus das ein Benutzer bereits eingeloggt ist.
    12. Dim CurrentUser As String = "Rebecca"
    13. 'Hinzufügen einer Adresse
    14. For Each User In ApplicationUsers.AllUsers
    15. If User.AppUsername = CurrentUser Then
    16. User.AppUserData.AddAdress("Max", "Mustermann", "Musterstraße 111", "99999", "Musterstadt", "Bundesland", "Land")
    17. End If
    18. Next User
    19. .
    20. .
    21. .
    22. 'Wenn fertig - speichern
    23. SaveAndLoadManagement.SaveXML(ApplicationUsers, Filename)

    Niko Ortner schrieb:

    Denn so wie es jetzt ist, ist klar, dass bei der Serialisierung die leeren Listen daherkommen, weil die Klassen ja auch leere Listen beinhalten.
    Das macht nur Sinn, wenn User andere User untergeordnet haben sollen, aber ich denke nicht, dass das beabsichtigt war.

    Ja das stimmt. Wie könnte ich das verbessern? Sollte ich vielleicht eine extra Klasse schreiben, die einfach nur die Benutzerliste mit den jeweiligen Adresslisten enthält? Was würdet ihr mir raten?

    Grüße Rebecca ;)

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

    @ErfinderDesRades: Wenn es so ist wie du sagst, dann sollte AppUser auch keine List(Of AppUser) haben. Dann müsste die List(Of UserData) in die AppUser-Klasse und für die List(Of AppUser) sollte ich wohl eine extra Klasse schreiben. Liege ich da richtig?

    Das Problem ist, dass in meinem Code die AppUser-Klasse nicht eine List(Of Userdata) enthält, sondern eine Instanz der Userdata-Klasse. Anhand dieser Instanz fügt man eine Adresse in die List(Of Userdata) ein, die sich ja wiederum in der UserData-Klasse selbst befindet.

    Mit der AppUser-Klasse ist es genau das gleiche. Die Klasse in meinem Programm, in der die meiste Arbeit geschieht, enthält ebenfalls eine Instanz der AppUser-Klasse. Die Benutzer werden anhand dieser Instanz ebenfalls der List(Of AppUser) hinzugefügt, die sich wie gesagt in der AppUser-Klasse selbst befindet. Das wird wohl das Problem an der ganzen Sache sein. Deswegen auch die überflüssigen Tags. Auch wenn es so natürlich funktioniert, kann man das doch bestimmt besser machen. Aber wie? Hättet ihr Vorschläge für mich?

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

    Warum AppUser denn nicht? Von dene soll doch jeder Kontakte zufügen können.

    Vor allem würde ich die Dinge auch so benennen:
    Also nenne v.a. eine KontaktListe Contacts.

    Achso, ja - deine AppUser haben ja auch noch eine AppUser-Auflistung.

    Also mir ist das echt zu verworren: Ein User hat eine Liste von Usern, und ein UserData hat eine Liste von UserDatas.
    Ausserdem hat ein User ein UserData, und über die Liste darin auch Zugriff auf viele UserDatas.
    Warum hat ein User viele Users, und ausserdem noch viele UserDatas? - Bist du dir sicher, das alles zu brauchen?

    Was ist der Unterschied zw. einem User und einem UserData?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Die AppUser-Klasse ist dafür da um die Benutzer anzulegen. Das Problem ist, dass ich innerhalb der AppUser-Klasse eine List(Of AppUser) deklariert habe, stimmt's?

    Die AppData-Klasse ist dafür da, um die Adressdaten zu speichern. Da habe ich eine List(Of UserData) deklariert. D.h.auch eine Liste der eigenen Klasse.

    Jetzt werdet ihr euch wahrscheinlich fragen, wieso hat sie das so gemacht? Ehrlich gesagt, weiß ich das selber nicht so genau.

    Eigentlich sollte ich innerhalb der AppUser-Klasse eine List (Of UserData) deklarieren, richtig?
    Weiß ich nicht - ich weiß ja nicht, was das ganze soll.

    Rebecca82 schrieb:

    Das Problem ist, dass ich innerhalb der AppUser-Klasse eine List(Of AppUser) deklariert habe, stimmt's?
    Weiß ich nicht.
    Möglich ists auf jeden Fall, und es kann auch durchaus sinnvoll sein, vom Prinzip her.
    Allerdings mit Serialisierung kann das vlt. ins Auge gehen: Wenn 2 User sich gegenseitig kontakten - möglicherweise bewirkt das beim Serialisieren eine Endlos-Rekursion - probiert hab ich sowas aber noch nie.

    Die viel wichtigere Kernfrage ist aber nicht beantwortest: Was ist der prinzipielle Unterschied zw. einem User und einem UserData?

    Inne OOP soll jede Klasse eine Verantwortlichkeit haben, und keine 2 Klassen sollen dieselbe haben, und da ist mir das wirr.

    Denn in AppUser speicherst du User-Daten, und in UserData speicherst du auch User-Daten. Da musst du einen guten Grund für haben, in 2 verschiedenen Klassen User-Daten zu speichern, ansonsten muss UserData weg.
    Nee, ich habe mich wohl nicht richtig ausgedrückt. Die AppUser-Klasse beinhaltet die Nutzer des Programms. Also Benutzername, Passwort bzw. Hash, UserID usw. Die UserData-Klasse ist dazu da um Adressen zu speichern. Wenn ein Benutzer sich eingeloggt hat, kann er Adressen eingeben und anschließend speichern. Siehe bitte auch die Sourcecode-Ausschnitte von meinem ersten Post in diesem Thread. Jeder Benutzer soll beliebig viele Adressen speichern können. Jeder Benutzer seine eigenen Adressen. Also ein Benutzer kann auch nur seine Adressen einsehen, erstellen, löschen usw. Daher die List (Of UserData).

    Im Programm selbst sollen auch beliebig viele Benutzer registriert werden können. Daher die List (Of AppUser). Ich hoffe das ihr ungefähr verstanden habt was das Ziel ist. :)

    Es geht lediglich nur darum, dass Benutzer sich registrieren, sich anschließend einloggen und Daten (in diesem Fall nur Adressen) eingeben, speichern oder auch wieder löschen können. Nicht mehr. ;)

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