Speichern und Öffnen einer List(Of T) mit Sub List (Of T)

  • Allgemein

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von ViktorS.

    Speichern und Öffnen einer List(Of T) mit Sub List (Of T)

    Hallo, ich einen einen Quellcode der ungefehr so aussieht.
    Quellcode:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Public Property lList As New List(Of List)
    3. Class List
    4. Public Property Name As String
    5. Public Property User As New List(Of User)
    6. End Class
    7. Class User
    8. Public Property Name As String
    9. Public Property Status As String
    10. End Class
    11. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    12. For i As Integer = 0 To 10
    13. Dim lst As New List
    14. For u As Integer = 0 To 25
    15. Dim usr As New User
    16. usr.Name = i
    17. usr.Status = u
    18. lst.User.Add(usr)
    19. Next
    20. lst.Name = i
    21. lList.Add(lst)
    22. Next
    23. End Sub
    24. End Class



    Ich habe eine Liste von einer Klasse mit eigenschaften. Eine von diesen Eigenschaften ist eine neue Liste von wiederrum eine rneuen Klasse mit eigenschaften.
    Ich möchte jetzt die lKlasse(im Quellcode) speichern. Dabei sollen alle List Klassen in dieser Liste und zu jeder ListKlasse auch noch die Liste der User Klassen. Die Nebeneigenschaften sollen dabei auch gespeichert werden. Wie kann ich das ambesten machen und mit welcher Speicherungsmethode?

    Kann mir da jemand Tipps geben? ICh persönlich würde sagen mit der Xml Wariente, ich kenne mich mi Xml aber nicht aus.

    ViktorS schrieb:

    Kann mir da jemand Tipps geben? ICh persönlich würde sagen mit der Xml Wariente, ich kenne mich mi Xml aber nicht aus.

    Denke auch der XML-Serializer ist das beste , wenn Du Dir nicht ein eigenes Format stricken möchtest. Nimm folgende Klasse, speichere sie unter Serializer.vb ab und binde sie in Dein Projekt ein:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. '############################################################################################
    2. '######## CLASS SERIALIZER ######### -----
    3. '############################################################################################
    4. '---
    5. '--- This class offers serialization services
    6. '--- binary with optional compression
    7. '--- XML
    8. '--- relative filenames will be accepted
    9. '--- if filename does not exist it will be created
    10. Imports System.Runtime.Serialization.Formatters.Binary
    11. Imports System.IO
    12. Imports System.IO.Compression
    13. Public Class Serializer
    14. ' source: http://www.vbarchiv.net/tipps/details.php?id=1749
    15. ' see also article about generics at: http://www.devproconnections.com/article/net-framework2/net-generics.aspx
    16. '############################################################
    17. '### METHODS #####
    18. '############################################################
    19. '-------------------------------
    20. '-- BinarySerialize ----
    21. '-------------------------------
    22. Public Shared Sub BinarySerialize(Of T)(ByVal fileName As String, ByVal instance As T, ByVal compression As Boolean)
    23. Dim fullPath As String
    24. Try
    25. fullPath = System.IO.Path.GetFullPath(fileName)
    26. ' create directory
    27. If Not Directory.Exists(Path.GetDirectoryName(fullPath)) Then
    28. Directory.CreateDirectory(Path.GetDirectoryName(fullPath))
    29. End If
    30. Dim fs As Stream = New FileStream(fullPath, FileMode.OpenOrCreate)
    31. Dim bf As New BinaryFormatter
    32. ' use optional compression
    33. If compression Then fs = New GZipStream(fs, CompressionMode.Compress)
    34. bf.Serialize(fs, instance)
    35. fs.Close()
    36. Catch ex As Exception
    37. MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error)
    38. End Try
    39. End Sub
    40. Public Shared Sub BinarySerialize(Of T)(ByVal fileName As String, ByVal instance As T)
    41. BinarySerialize(fileName, instance, False)
    42. End Sub
    43. '-------------------------------
    44. '-- BinaryDeserialize ----
    45. '-------------------------------
    46. Public Shared Function BinaryDeserialize(Of T)(ByVal fileName As String, ByVal defaultInstance As T, ByVal compression As Boolean) As T
    47. Dim fullPath As String
    48. Try
    49. fullPath = System.IO.Path.GetFullPath(fileName)
    50. ' create file if not exist with defaultInstance
    51. If Not File.Exists(fullPath) Then
    52. BinarySerialize(fileName, defaultInstance, compression)
    53. Return defaultInstance
    54. End If
    55. Dim fs As Stream = New FileStream(fileName, FileMode.OpenOrCreate)
    56. Dim bf As New BinaryFormatter
    57. If compression Then fs = New GZipStream(fs, CompressionMode.Decompress)
    58. BinaryDeserialize = CType(bf.Deserialize(fs), T)
    59. fs.Close()
    60. Catch ex As Exception
    61. MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error)
    62. End Try
    63. End Function
    64. Public Shared Function BinaryDeserialize(Of T)(ByVal fileName As String, ByVal defaultInstance As T) As T
    65. Return BinaryDeserialize(Of T)(fileName, defaultInstance, False)
    66. End Function
    67. Public Shared Function BinaryDeserialize(Of T As New)(ByVal fileName As String, ByVal compression As Boolean) As T
    68. Return BinaryDeserialize(Of T)(fileName, New T, compression)
    69. End Function
    70. Public Shared Function BinaryDeserialize(Of T As New)(ByVal fileName As String) As T
    71. Return BinaryDeserialize(Of T)(fileName, New T)
    72. End Function
    73. '-------------------------------
    74. '-- XMLSerialize ----
    75. '-------------------------------
    76. Public Shared Sub XMLSerialize(Of T)(ByVal fileName As String, ByVal instance As T)
    77. Dim fullPath As String
    78. Try
    79. fullPath = System.IO.Path.GetFullPath(fileName)
    80. ' create directory
    81. If Not Directory.Exists(Path.GetDirectoryName(fullPath)) Then
    82. Directory.CreateDirectory(Path.GetDirectoryName(fullPath))
    83. End If
    84. ' create serializer and stream
    85. Dim xs As New System.Xml.Serialization.XmlSerializer(GetType(T))
    86. Dim fs As Stream = New FileStream(fullPath, FileMode.OpenOrCreate)
    87. ' serialize
    88. xs.Serialize(fs, instance)
    89. fs.Close()
    90. Catch ex As Exception
    91. MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error)
    92. End Try
    93. End Sub
    94. '-------------------------------
    95. '-- XMLDeserialize ----
    96. '-------------------------------
    97. Public Shared Function XMLDeserialize(Of T)(ByVal fileName As String, ByVal defaultInstance As T) As T
    98. Dim fullPath As String
    99. Try
    100. fullPath = System.IO.Path.GetFullPath(fileName)
    101. ' create file if not exist with defaultInstance
    102. If Not File.Exists(fullPath) Then
    103. XMLSerialize(fileName, defaultInstance)
    104. Return defaultInstance
    105. End If
    106. ' create serializer and stream
    107. Dim fs As Stream = New FileStream(fileName, FileMode.OpenOrCreate)
    108. Dim xs As New System.Xml.Serialization.XmlSerializer(GetType(T))
    109. ' deserialize
    110. XMLDeserialize = CType(xs.Deserialize(fs), T)
    111. fs.Close()
    112. Catch ex As Exception
    113. MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error)
    114. End Try
    115. End Function
    116. End Class


    Dein Beispielcode kannn damit so abspeichern:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Option Strict Off
    2. Public Class Form1
    3. Public Property lList As New List(Of List)
    4. Class List
    5. Public Property Name As String
    6. Public Property User As New List(Of User)
    7. End Class
    8. Class User
    9. Public Property Name As String
    10. Public Property Status As String
    11. End Class
    12. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    13. For i As Integer = 0 To 10
    14. Dim lst As New List
    15. For u As Integer = 0 To 25
    16. Dim usr As New User
    17. usr.Name = i
    18. usr.Status = u
    19. lst.User.Add(usr)
    20. Next
    21. lst.Name = i
    22. lList.Add(lst)
    23. Next
    24. Serializer.XMLSerialize("lList.xml", lList)
    25. End Sub
    26. End Class

    A, perfekt :)

    Ich finde nur nicht heraus, wie man das Gespeicherte beim Öffnen wieder einlesen kann.
    Ich habe diesen Code, aber die MsgBox sagt mir für den Wert 0.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Property lList As New List(Of List)
    2. Class List
    3. Public Property Name As String
    4. Public Property User As New List(Of User)
    5. End Class
    6. Class User
    7. Public Property Name As String
    8. Public Property Status As String
    9. End Class
    10. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    11. If File.Exists("lList.xml") Then
    12. Serializer.XMLDeserialize("lList.xml", lList)
    13. MsgBox(lList.Count)
    14. Else
    15. For i As Integer = 0 To 10
    16. Dim lst As New List
    17. For u As Integer = 0 To 25
    18. Dim usr As New User
    19. usr.Name = i
    20. usr.Status = u
    21. lst.User.Add(usr)
    22. Next
    23. lst.Name = i
    24. lList.Add(lst)
    25. Next
    26. Serializer.XMLSerialize("lList.xml", lList)
    27. End If
    28. End Sub

    ViktorS schrieb:

    Ich finde nur nicht heraus, wie man das Gespeicherte beim Öffnen wieder einlesen kann.

    Der Deserializer ist als Funktion definiert, gibt also die Liste wieder zurück wenn das XML-File existiert. Also müsste Dein Code lauten:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Property lList As New List(Of List)
    2. Class List
    3. Public Property Name As String
    4. Public Property User As New List(Of User)
    5. End Class
    6. Class User
    7. Public Property Name As String
    8. Public Property Status As String
    9. End Class
    10. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    11. If File.Exists("lList.xml") Then
    12. lList = Serializer.XMLDeserialize("lList.xml", New List(Of List))
    13. MsgBox(lList.Count)
    14. Else
    15. For i As Integer = 0 To 10
    16. Dim lst As New List
    17. For u As Integer = 0 To 25
    18. Dim usr As New User
    19. usr.Name = i
    20. usr.Status = u
    21. lst.User.Add(usr)
    22. Next
    23. lst.Name = i
    24. lList.Add(lst)
    25. Next
    26. Serializer.XMLSerialize("lList.xml", lList)
    27. End If
    28. End Sub


    hoffe ich jedenfalls :) ....

    Das 2.Argument des Deserializers ist ein Voreinstellungs-Wert den er zurückgeben soll wenn er die datei nicht findet.

    Die Darstellung Deines XML-Inhalts kannst Du noch mit den Attributen <XMLAttribute> und <XMLElement> vor Deinen ElementenNamen verändern, aber das musst Du bitte selber nachlesen.