Deserialize - Kein oberstes Objekt.

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von samuel.

    Deserialize - Kein oberstes Objekt.

    Hy Leute,

    ich versuche einen Stream über Deserialize in ne Listbox zu laden...

    VB.NET-Quellcode

    1. listview.Items.AddRange(bf.Deserialize(cryptoS))

    Er bringt jedoch den Fehler: Kein oberstes Objekt.
    Was heißt das? (findet er kein Header???)
    Normalerweise gibt das deserialisieren eine Instanz eines Objekts Function Deserialize(byval PfadZurDatei) as Object zurück.
    Das kannst du eine Variable diesen Typs casten

    VB.NET-Quellcode

    1. dim test as DeineKlasse = CType(bf.Deserialize(cryptoS), DeineKlasse)

    jedoch nicht gleich einer Listbox adden.

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    @nafets3646: Das müsste schon AddRange heißen, da ich ein Array von ListviewItems hinzufüge.
    @fichz: Ich serialisiere eine Array von ListviewItems. Dewegen müsste es eigentlich funktionieren. Hätte es vielleichts erwähnen sollen.

    Vielleicht sollte ich mal mein ganzen Vorhaben beschreiben...
    Ich habe bisscher eine Listview(bzw. die enthaltenen Items) serialisiert und über einen CryptoStream(TrippleDES) verschlüsselt.
    Das hat auch funktioniert ebenso das Entschlüsseln. (keySave in Showroom)

    Jetzt wollte ich jedoch den Verschlüsselungsalgorithmus in Rijndael ändern, da dieser sicherer ist.
    Hier mein Code fürs Verschlüsseln:

    VB.NET-Quellcode

    1. fileS = New FileStream(file, FileMode.Create)
    2. cryptoS = New CryptoStream(fileS, rij.CreateEncryptor, CryptoStreamMode.Write)
    3. Dim bf As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
    4. Dim lstv(listview.Items.Count - 1) As ListViewItem
    5. 'Neuen IV erstellen & speichern
    6. rij.GenerateIV()
    7. fileS.Write(rij.IV, 0, rij.IV.Length)
    8. 'Stream erstellen & verschlüsseln
    9. listview.Items.CopyTo(lstv, 0)
    10. bf.Serialize(cryptoS, lstv)
    11. 'Streams schließen
    12. cryptoS.Close()
    13. fileS.Close()


    Das Objekt rij wird direkt in der Klasse deklariert und der Key bei der Initialisierung hinzugefügt.
    Bei jedem Speichern wird ein neuer IV erzeugt.

    Das Entschlüsseln mach ich so:

    VB.NET-Quellcode

    1. fileS = New FileStream(file, FileMode.Open)
    2. 'verwendeter IV auslesen und hinterlegen
    3. Dim iv(15) As Byte
    4. fileS.Read(iv, 0, 16)
    5. rij.IV = iv
    6. cryptoS = New CryptoStream(fileS, rij.CreateDecryptor, CryptoStreamMode.Read)
    7. Dim bf As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
    8. 'Listview vorbereiten & mit Stream füllen
    9. listview.Items.Clear()
    10. listview.Items.AddRange(bf.Deserialize(cryptoS))
    11. 'Streams schließen
    12. 'cryptoS.Close()
    13. fileS.Close()


    Wenn ich den CryptoStream jeweils auslassen und den Stream vom serialisieren direkt in den fielS (FileStream) schicke funktioniert es wunderbar...

    Ich hoffe der Fehler ist nicht zu peinlich :S
    Wenn du ein Array serialisierst dann musst du es beim deserialisieren halt zurück in Array casten.
    Vermutlich hast kein Option Strict On aktiviert, da sonst eigentlich ein Fehler aufscheinen müsste.
    Deserialize gibt ein Objekt (das ist kein Array) zurück. msdn.microsoft.com/de-de/library/b85344hz(v=vs.80).aspx

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    Hab zum Testen nochmal nen neues Projekt angelegt und bin Zeile für Zeile das Tut durchgegangen.
    Und es hat funktioniert. Hab also den Code ins eigentliche Projekt übertragen und so wenig wir möglich geändert. Funktioniert jetzt!
    Ich weiß immer noch nicht genau woran es genau gelegen hat.
    (Hab auch nen bisschen den Überblick verloren, was ich geändert habe und nicht... Vielleicht ist jemand Motiviert und findet den entscheidenden Unterschied)

    Falls sich jemanden für den Code interessiert:

    Verschlüsseln:

    VB.NET-Quellcode

    1. 'Neuen IV erstellen
    2. rij.GenerateIV()
    3. 'FileStream initialisieren
    4. fileS = New FileStream(file, FileMode.Create)
    5. 'IV als erstes speichern
    6. fileS.Write(rij.IV, 0, rij.IV.Length)
    7. 'VerschlüsselungsStream initialisieren
    8. cryptoS = New CryptoStream(fileS, rij.CreateEncryptor, CryptoStreamMode.Write)
    9. 'BinaryFormatter um zu Serialisieren
    10. Dim bf As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
    11. 'ListviewItemKopie --> Stream erstellen & verschlüsseln
    12. Dim li(listview.Items.Count - 1) As ListViewItem
    13. listview.Items.CopyTo(li, 0)
    14. bf.Serialize(cryptoS, li)
    15. 'Streams schließen
    16. cryptoS.Close()
    17. fileS.Close()


    Entschlüsseln:

    VB.NET-Quellcode

    1. 'FileStream
    2. fileS = New FileStream(file, FileMode.Open)
    3. 'IV
    4. Dim iv(15) As Byte
    5. 'Verwendeter IV auslesen und hinterlegen
    6. fileS.Read(iv, 0, 16)
    7. rij.IV = iv
    8. 'VerschlüsselungsStream initialisieren
    9. cryptoS = New CryptoStream(fileS, rij.CreateDecryptor, CryptoStreamMode.Read)
    10. 'BinaryFormatter um zu Deserialisieren
    11. Dim bf As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
    12. 'Listview vorbereiten & mit Stream füllen
    13. listview.Items.Clear()
    14. listview.Items.AddRange(bf.Deserialize(cryptoS))
    15. 'Streams schließen
    16. cryptoS.Close()
    17. fileS.Close()


    Der key wird einmalig als Hash im Konstruktor erzeugt und zugewiesen.