Mehrere Datensätze in eine XML Datei serialisieren

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Tukuan.

    Mehrere Datensätze in eine XML Datei serialisieren

    Hallo Forum,

    ich weiß leider nicht genau, ob das so funktioniert.
    Folgendes:
    Ich habe eine Klasse erstellt, in der Daten für verschiedene Projekte gespeichert werden. Zunächst als Variablen...
    Diese können vom Benutzer in eine XML Datei geschrieben und wieder daraus gelesen werden.
    Allerdings ist dieses ziemlich umständlich, da ich jede Variable einzelt schreibe/lese. Ich muss, wenn eine neue Variable hinzu kommt, diese mehrfach im Sourcecode einfügen -> ganz schön fehlerträchtig.
    Nun bin ich auf die Möglichkeit des Serialisierens gestoßen.
    Klingt toll. Aber ich habe bisher nur Möglichkeiten gesehen, komplette Datensätze in eine Datei zu speichern. Neue Datensätze stehen dann ggf. in einer weiteren Datei.
    Ich benötige aber das Auslesen bzw. das Schreiben eines Datensatzes aus/in eine/r Datei. So stell ich mir eine Funktion vor:

    Quellcode

    1. Public Function SerializeOneDataset(sFile, as String, nDataset as Integer) as clsDataset


    Kann man das Serialisieren nutzen, um diverse Datensätze in eine Datei zu speichern?
    Und wenn ja wie?
    So sieht meine XML Datei aus:

    XML-Quellcode

    1. <projects>
    2. <dataset0>
    3. <Projektnummer>1234</Projektnummer>
    4. <Customer>Ich</Customer>
    5. <Type>x100</Type>
    6. <!usw.>
    7. </dataset0>
    8. <dataset1>
    9. <Projektnummer>0815</Projektnummer>
    10. <Customer>Der da</Customer>
    11. <Type>xyz</Type>
    12. <!usw.>
    13. </dataset1>
    14. <!usw.>
    15. </projects>


    Vielen Dank im Voraus
    Gruß
    Tukuan

    Tukuan schrieb:

    Nun bin ich auf die Möglichkeit des Serialisierens gestoßen.

    Was bezeichnest Du als serialisieren ?

    Die Dataset Klasse implementiert selber die Methoden WriteXML, ReadXML, GetXML ohne die Notwendigkeit eines Serialisers.

    Da aber das Dataset auch das Interface IXMLSerializable inplementiert, kann man natürlich eine ganze List(of Dataset) per XMLFormatter in eine XML-Datei serialisieren.

    ne doch nicht...

    Entweder ich versehte das nicht ganz, oder es passt nicht richtig.

    Auch hiermit bekommt man nur die ganze XML Datei ausgegeben.
    Ich benötige, eine Möglichkeit die mir aus der ganzen XML Datei nur dieses wiedergibt:

    XML-Quellcode

    1. <dataset1>
    2. <Projektnummer>0815</Projektnummer>
    3. <Customer>Der da</Customer>
    4. <Type>xyz</Type>
    5. <!usw.>
    6. </dataset1>


    Gruß
    Tukuan
    Whoa, mal wieder zurück zum Anfang, ich denke wir reden aneinander vorbei.

    Serialiseren ist für mich das Wegschreiben der Eigenschaften eines Objektes in eine Datei ( oder Stream), entweder als XML mit XMLSerializer oder binaer per BinaryFormatter oder Soap-Formatter.

    Mit Datensatz verbinde ich das System.Data.Dataset, einer Art In-Memory Datenbank mit Tabellen , Zeilen und Spalten.

    In diesem Zusammenhang war auch meine erste Antwort zu lesen, und vermutlich nicht gerade das was Du beabsichtigt hattest :rolleyes:

    Ich vermute mal, dass Deine Projekte keinen standardisierten Satz von Eigenschaften haben, so wie es in Deiner XML-Datei aussieht, sondern pro Projekt unterschiedliche Eigenschaften aufweisen - oder ?

    vielleicht doch kein XML?

    Sorry, bin gerade unterwegs und habe kaum Internetzugriff...

    Ich vermute auch stark, dass es keine standartisierte Lösung für meine Anforderungen gibt.

    Kennst du vielleicht eines?
    Ich muss eine Datei erzeugen können, die verschiedene Datensätze zu Projekten enthält. Ich muss Projekte hinzufügen, ändern und löschen können. Falls das alles geht.

    Gruß
    Tukuan
    Grundsätzlich geht all das, nur ist immer die Frage wie bequem man wieder die entsprechenden Datensätze projektbezogen herstellen kann.

    Zum Beispiel kann man mit einem XMLDocument arbeiten und per XPath darauf zugreifen, bzw XDocument und LinQ - Abfragen (Howto: LinQ to XML ).

    Auch hübsch wäre eine Basisklasse Projektsettings zu definieren, die nur eine ID zur Verfügung stellt, wobei andere Projekte ihre individuelle Settings von dieser Basisklasse ableiten. Dann können willkürliche Settings in einer Collection oder List (of Projektsetting ) gehalten und gespeichert werden. Statt einer Basisklasse kann man auch ein Interface definieren, käme aufs Gleiche hinaus.

    Problem ist dabei nur , dass XML nicht typsicher ist und daher diese Liste nicht serialisieren kann. Mit Binary Serialization (=BinaryFormatter) geht es dagegen ganz hervorragend:

    Serialisierung einer generischen Liste

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.Runtime.Serialization.Formatters.Binary
    3. Class Form1
    4. Private Sub btnSerialize_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSerialize.Click
    5. ' create serializer & stream
    6. Dim bf As New BinaryFormatter
    7. Dim fs As New IO.FileStream("D:\test.bin", IO.FileMode.Create)
    8. ' create different project settings
    9. Dim pA As New ProjektSettingA
    10. Dim pB As New ProjektSettingB
    11. ProjektSetting.List.Clear()
    12. ProjektSetting.List.Add(pA)
    13. ProjektSetting.List.Add(pB)
    14. ' serialize
    15. bf.Serialize(fs, ProjektSetting.List)
    16. fs.Close()
    17. End Sub
    18. Private Sub Deserialize_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Deserialize.Click
    19. ' create serializer & stream
    20. Dim bf As New BinaryFormatter
    21. Dim fs As New IO.FileStream("D:\test.bin", IO.FileMode.Open)
    22. ' deserialize stream into object & cast to list
    23. Dim o As Object = bf.Deserialize(fs)
    24. ProjektSetting.List = DirectCast(o, List(Of ProjektSetting))
    25. ' done
    26. fs.Close()
    27. End Sub
    28. Private Sub Print_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Print.Click
    29. For Each p As ProjektSetting In ProjektSetting.List
    30. Trace.WriteLine(p.GetType.ToString)
    31. Next
    32. End Sub
    33. End Class
    34. <Serializable()> _
    35. Public Class ProjektSetting
    36. Public Shared List As New List(Of ProjektSetting)
    37. Public ID As String
    38. End Class
    39. <Serializable()> _
    40. Public Class ProjektSettingA
    41. Inherits ProjektSetting
    42. Public A As String = "A"
    43. End Class
    44. <Serializable()> _
    45. Public Class ProjektSettingB
    46. Inherits ProjektSetting
    47. Public B As String = "B"
    48. End Class


    my 5 cent
    Moin Kangaroo,

    vielen Dank, ich muss mir wohl mal weitere Gedanken machen.
    Die Lösung, die ich schon fast vollständig erstellt habe, funktioniert schon zu 90 % mit XML.
    Ich denke ich bleibe dann erst mal dabei - auch wenn es wirklich keine schöne Lösung ist...

    Gruß
    Tukuan

    Kann ich machen...

    Ich benötige allerdings nochh ein wenig Zeit. Es läuft noch nicht 100%ig.
    Und leider stecke ich gerade in einem anderem Projekt fest und mache fast gar nichts an dem SW-Projekt... :pinch:

    Tukuan