leere List(Of String) aus XML lesen

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

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    leere List(Of String) aus XML lesen

    Hallo

    ich habe eine Klasse, die ein Settings-XML repräsentiert. In dieser Klasse sind alle Standardwerte für die EInstellungen definiert. Der Sinn der Sache ist, dass beim Initialisieren erstmal alle Settings ihren Standardwert erhalten, die dann durch die Werte in der XML beim Lesen der XML ersetzt werden. Wenn ein neues Setting hinzugekommen ist, das in der XML noch nicht vorhanden ist, dann soll der Standardwert verwendet werden. Das funktioniert eigentlich genauso wie geplant, ausser für List(Of). Wenn die Liste in der XML leer ist wird diese nicht verwendet, sprich die Standardeinstellunge nicht überschrieben.

    VB.NET-Quellcode

    1. Public Class Settings
    2. Public Property ShowImage As Boolean = True
    3. Public Property ImageCount As Integer = 4
    4. Public Property Language As String = "English_(en_US)"
    5. Public Property ProfileList As List(Of String) = New List(Of String) From {{"aaa"}, {"bbb"}}
    6. End Class


    XML-Quellcode

    1. <?xml version="1.0" encoding="utf-8"?>
    2. <Settings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    3. <ShowImage>false</ShowImage>
    4. <ImageCount>2</ImageCount>
    5. <ProfileList />
    6. </Settings>


    Dim test As New Settings() erstellt nun das Objekt mit den Standardwerten.
    Beim Lesen der XML wird nach oberem Beispiel nun ShowImage auf false gestellt, ImageCount auf 2, Language bleibt "English_(en_US)" da in der XML nicht definiert, aber ProfileList wird nicht mir der leeren Liste überschrieben und die Standardwerte bleiben erhalten.

    Warum ist das so?

    EDIT: Mir ist gerade aufgefallen, dass es mit String() anstelle von List(Of String) funktionieren würde. Warum gibt es ein unterschiedliches Verhalten zwischen einem Array und einer List?

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

    @DanCooper Probier mal so was (Pseudocode):

    Quellcode

    1. Dim MyKlass = New Klass()
    2. Deserialize(MyKlass)
    3. If MyKlass.MyList.Count = 0 Then
    4. MyKlass.MyList.Ad("aaa")
    5. MyKlass.MyList.Ad("bbb")
    6. End If
    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!
    @VB1963 Ich hab das so verstanden, dass er eine eigene Settings-Klasse hat.
    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!

    RodFromGermany schrieb:

    @DanCooper Probier mal so was (Pseudocode):

    Quellcode

    1. Dim MyKlass = New Klass()
    2. Deserialize(MyKlass)
    3. If MyKlass.MyList.Count = 0 Then
    4. MyKlass.MyList.Ad("aaa")
    5. MyKlass.MyList.Ad("bbb")
    6. End If


    Das Problem ist, dass dieser Weg nicht funktioniert. So würden, wenn in der XML eine leere Liste vorhanden ist, immer die Standardwerte aaa und bbb gesetzt. D.h. der User leert die Liste, speichert und beim nächsten Laden sind wieder die Standardwerte drin. Was ich will ist dass wenn das Node in der XML nicht vorhanden ist die Standardwerte verwendet werden, wenn die Liste leer ist soll nichts drin stehen und wenn was in der Liste ist sollen diese Werte verwendet werden. Ich habs nun so gelöst:

    VB.NET-Quellcode

    1. Public Class Settings
    2. Public Property ShowImage As Boolean = True
    3. Public Property ImageCount As Integer = 4
    4. Public Property Language As String = "English_(en_US)"
    5. <XmlIgnore>
    6. Public Property ProfileList As List(Of String) = New List(Of String) From {{"aaa"}, {"bbb"}}
    7. <XmlArray("ProfileList")>
    8. Public Property ProfileListXml As String()
    9. Get
    10. Return ProfileList.ToArray
    11. End Get
    12. Set(value As String())
    13. If value IsNot Nothing Then
    14. ProfileList.Clear()
    15. ProfileList.AddRange(value.ToList)
    16. End If
    17. End Set
    18. End Property
    19. End Class


    Irgendwie ein wenig unbefriedigend viel Code, aber es funktioniert.

    Was mir aufgefallen ist in Zusammenhang mit List (Of String) und dem XmlSerializer:
    Leere Listen in der XML werden zwar geschrieben aber nicht gelesen.
    Wenn ich die List(Of String) in Get und Set "aufdrösle" (keine Ahnung wie das korrekt heisst) wird beim Deserialisieren mit XmlSerializer keine der beiden Funktionen angesprochen sondern der Wert einfach übernommen. Selbst wenn ich unter Set den value verwerfe wird er übernommen. Wenn ich das selbe mit einem String() Array mache werden Get und Set ausgeführt. ?(

    DanCooper schrieb:

    Das Problem ist, dass dieser Weg nicht funktioniert.
    Dann mach Dir noch einen Boolean Wert daneben: False - erste Initialisierung, diese Werte eintragen, True - schon mal initialisiert - nix tun.
    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!