ListView Deserialisieren

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

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von Quellcoder02.

    ListView Deserialisieren

    Hallo,

    ich habe ein problem beim Deserialisieren meiner ListView. Bei meinem verwendeten Code bekomme ich folgende Fehlermeldung:
    Fehler bei der Überladungsauflösung, da keine zugreifbare "AddRange" mit diesen Argumenten aufgerufen werden kann:
    "Public Overloads Sub AddRange(items As ListViewItem())": "Option Strict On" lässt keine impliziten Konvertierungen von "Object" in "ListViewItem()" zu.
    "Public Overloads Sub AddRange(items As ListView.ListViewItemCollection)": "Option Strict On" lässt keine impliziten Konvertierungen von "Object" in "ListView.ListViewItemCollection" zu. Ordnung C:\Users\Lukas\Documents\Visual Studio 2013\Projects\Ordnung\Ordnung\fclass.vb 45 Aktiv

    Mit diesem Code:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Shared Sub ListViewLoad(ByVal path As String, ByVal lv As ListView)
    2. Dim f As New IO.FileStream(path, IO.FileMode.Open)
    3. Dim bf As New BinaryFormatter
    4. lv.Items.Clear()
    5. lv.Items.AddRange(bf.Deserialize(f))
    6. f.Close()
    7. End Sub



    Weiß jemand eine Lösung? Danke schon einmal im Vorraus.
    MfG Quellcoder
    Projekte
    @Bluespide so:

    VB.NET-Quellcode

    1. Public Shared Sub ListViewSave(ByVal path As String, ByVal lv As ListView)
    2. Dim f As New FileStream(path, IO.FileMode.Create)
    3. Dim bf As New BinaryFormatter
    4. Dim l(lv.Items.Count - 1) As ListViewItem
    5. lv.Items.CopyTo(l, 0)
    6. bf.Serialize(f, l)
    7. f.Close()
    8. End Sub
    Projekte
    @Quellcoder02 Nimm ein DataGridView, gib dem als DataSource ein typisiertes DataSet und speichere / lade dieses als XML. Feddich.
    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!
    Du gehst das Ganze schon beim Serialisieren falsch an. Da die Property Items der ListView eine ListViewItemCollection repräsentiert, brauchst du dir kein ListViewItem-Array machen. Du brauchst bloß die Serialisierung auf die ListViewItemCollection anzuwenden:

    VB.NET-Quellcode

    1. Sub SaveListViewItems(lv As ListView, pfad As String)
    2. Using fs As New FileStream(pfad, FileMode.Create)
    3. Dim bf As New BinaryFormatter
    4. bf.Serialize(fs, lv.Items)
    5. End Using
    6. End Sub
    7. Sub LoadListViewItems(lv As ListView, pfad As String)
    8. Using fs As New FileStream(pfad, FileMode.Open)
    9. Dim bf As New BinaryFormatter()
    10. Dim collection As ListView.ListViewItemCollection =
    11. bf.Deserialize(fs) 'Eventuell noch ein CType zum casten
    12. End Using
    13. End Sub

    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell
    @Radinator danke für deine Antwort, nur kann mein Code nicht so falsch gewesen sein. Denn 1. es wurde eine XML-Datei mit dem Serialisierten Item erstellt und 2. Ist beim Serialisieren nicht mein Programm abgestürzt.

    Bei deinem serialisieren stürzt mir beim Aufruf der Sub mein Programm ab und möchte ich es im FormClosing-Event aufrufen lässt es sich nicht mehr schließen. Das einzige das in der XML-Datei steht ist: ÿÿÿÿ
    Beim Deserialieseren kommt der Fehler: Das Datenstromende wurde erreicht, bevor die Verarbeitung abgeschlossen wurde.

    Würde mich freuen wenn du oder jemand anders eine Lösung wüsste, das Serialisieren hat bei meinem Code zumindest geklappt.
    MfG Quellcoder
    Projekte

    Quellcoder02 schrieb:

    das Serialisieren hat bei meinem Code zumindest geklappt.


    Deine Annahme ist solange falsch, bis du erfolgreich deserialisiert hast. Bis dahin ist dein Programm beim serialisieren lediglich nicht abgestürzt ;)
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Kennst du Schrödingers Katze? Geht in die selbe Richtung :)

    Ich bin auch schon von Dingen ausgegangen, die später ganz anders waren. Nur eine erfolgreiche deserialisierung bestätigt deine Annahme 100%ig. Das öffnen und reinschauen in deine xml ist kein Beweis deiner Annahme ;)
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen

    Quellcoder02 schrieb:

    es wurde eine XML-Datei mit dem Serialisierten Item erstellt
    In deinem Code (jedenfalls den, den du uns gegeben hast) steht nirgends etwas von xml als Datei Endung

    Quellcoder02 schrieb:

    Das einzige das in der XML-Datei steht ist: ÿÿÿÿ
    Du verwendest ja auch eine Binäre Serialisierung und keine XmlSerialisierung!

    Quellcoder02 schrieb:

    serialisierten xml-datei die Eigenschaften der items standen.
    Wie gesagt: XMLSerialisierung und Binär-Serialisierung sind zwar der selbe Gedanke (persisitieren von Daten), haben aber zwei ganz unterschiedliche Ausgaben (das eine - für den Menschen lesbar, weil XML - und das andere auf Basis von 0en und 1en)

    Ich hab dir hier noch mal den Code von mir um geschrieben, der funktionier auch. Eventuell kannst du ihn ja auch verwenden:

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports System.Runtime.Serialization.Formatters.Binary
    3. Public Class Form1
    4. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    5. Me.ListView1.Items.Add("Test1")
    6. Me.ListView1.Items.Add("Test2")
    7. Me.ListView1.Items.Add("Test3")
    8. Me.ListView1.Items.Add("Test4")
    9. Me.ListView1.Items.Add("Test5")
    10. Me.ListView1.Items.Add("Test6")
    11. Me.ListView1.Items.Add("Test7")
    12. End Sub
    13. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    14. If (File.Exists("datei.bin")) Then File.Delete("datei.bin")
    15. Dim data = Me.ListView1.Items.Cast(Of ListViewItem)().Select(Function(x) x.Text).ToList()
    16. Using fs As New FileStream("datei.bin", FileMode.CreateNew)
    17. Dim bf As New BinaryFormatter()
    18. bf.Serialize(fs, data)
    19. End Using
    20. End Sub
    21. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    22. Using fs As New FileStream("datei.bin", FileMode.Open)
    23. Dim bf As New BinaryFormatter()
    24. Dim list = CType(bf.Deserialize(fs), List(Of String))
    25. Dim items = New ListView.ListViewItemCollection(Me.ListView1)
    26. list.ForEach(Sub(x As String)
    27. 'items.Add(New ListViewItem() With {.Text = x}) 'Entweder diese Zeile oder die nächste
    28. Me.ListView1.Items.Add(New ListViewItem() With {.Text = x})
    29. End Sub)
    30. End Using
    31. End Sub
    32. Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    33. Me.ListView1.Items.Clear()
    34. End Sub
    35. End Class


    Lg Radinator
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell

    Radinator schrieb:

    VB.NET-Quellcode

    1. Dim data = Me.ListView1.Items.Cast(Of ListViewItem)().Select(Function(x) x.Text).ToList()
    2. '...
    3. list.ForEach(Sub(x As String)
    4. 'items.Add(New ListViewItem() With {.Text = x}) 'Entweder diese Zeile oder die nächste
    5. Me.ListView1.Items.Add(New ListViewItem() With {.Text = x})
    6. End Sub)

    Das kannste dir sparen.
    ListviewItem ist direkt serialisierbar.
    tatsächlich sollte der Code aus post#2 gehen - man muss ihn halt nach vb übersetzen.

    VB.NET-Quellcode

    1. lv.Items.AddRange(directcast(bf.Deserialize(f),ListViewItem())

    Zu beachten natürlich beim serialisieren, dass auch ein ListViewItem() serialisiert wird - sonst kann man das Deserialisat natürlich nicht directcasten.
    @Radinator Der Code war okay, aber wie du gesagt hast nicht .xml sonder .bin. Das einer der Fehler.

    ErfinderDesRades schrieb:

    lv.Items.AddRange(directcast(bf.Deserialize(f),ListViewItem())


    Das war der 2te Fehler. Mit dem DirectCast ist der Fehler bei AddRange weggegangen.

    Hier noch einmal der ganze Code falls jemand gleiche Probleme haben sollte:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Shared Path As String = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Ordner\Datei.bin")
    2. Public Shared Sub ListViewSave(ByVal path As String, ByVal lv As ListView)
    3. Dim f As New FileStream(path, IO.FileMode.Create)
    4. Dim bf As New BinaryFormatter
    5. Dim l(lv.Items.Count - 1) As ListViewItem
    6. lv.Items.CopyTo(l, 0)
    7. bf.Serialize(f, l)
    8. f.Close()
    9. End Sub
    10. Public Shared Sub ListViewLoad(ByVal path As String, ByVal lv As ListView)
    11. Dim f As New IO.FileStream(path, IO.FileMode.Open)
    12. Dim bf As New BinaryFormatter
    13. lv.Items.Clear()
    14. lv.Items.AddRange(DirectCast(bf.Deserialize(f), ListViewItem()))
    15. f.Close()
    16. End Sub



    Danke an alle die geholfen haben,
    MfG Quellcoder
    Projekte