Serialisierung von Objekten

  • VB.NET

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von thefiloe.

    Serialisierung von Objekten

    Hallo,

    Ich serialisiere Instanzen von Klassen mit:

    VB.NET-Quellcode

    1. Try
    2. Dim fs As Stream = New FileStream(My.Computer.FileSystem.SpecialDirectories.Desktop & "/try.txt", FileMode.OpenOrCreate)
    3. Dim bf As New BinaryFormatter
    4. If compression Then fs = New GZipStream(fs, CompressionMode.Compress)
    5. bf.Serialize(fs, instance)
    6. fs.Close()
    7. Catch ex As Exception
    8. MessageBox.Show(ex.Message, Application.ProductName, _
    9. MessageBoxButtons.OK, MessageBoxIcon.Error)
    10. End Try

    Das funktioniert auch wunderbar. Wie man sieht wird hier das ganze in die Datei try.txt gespeichert.
    Ich wollte das ganze nun so umbauen, dass es eben nicht direkt in eine Datei geschrieben wird, sondern in eine String Variable.
    Habe das dann so versucht:

    VB.NET-Quellcode

    1. Try
    2. Dim fs As Stream = New MemoryStream()
    3. Dim bf As New BinaryFormatter
    4. If compression Then fs = New GZipStream(fs, CompressionMode.Compress)
    5. bf.Serialize(fs, instance)
    6. fs.Close()
    7. Dim s As MemoryStream = fs
    8. Dim b As Byte() = s.ToArray()
    9. Dim x As String = UTF8.GetString(b)
    10. Return x
    11. Catch ex As Exception
    12. MessageBox.Show(ex.Message, Application.ProductName, _
    13. MessageBoxButtons.OK, MessageBoxIcon.Error)
    14. End Try

    Allerdings unterscheidet sich der Inhalt vom String x und dem Text in der Textdatei! Fast so als ob da was beim encoding schief läuft.
    In der Datei fängt die erste Zeile bspw. so an:
    " ÿÿÿÿ INamcore Studio, Version=0.0.6.45119,..."
    In meinem String sieht es dagegen so aus:
    " ���� INamcore Studio, Version=0.0.6.45119,..."

    Was läuft da also falsch?
    Hallo,

    ich habe ein Tutorial für die Serialisierung von Objekten mit JSON gemacht:

    HIER

    Wenn du möchtest, kannst du ja von Binary auf JSON umsteigen ;)

    MFG

    Alex-Digital :D
    ~ Alex-Digital :D

    if(!Internet.VBP.Get<User>("Alex-Digital").IsOnline) this.Close(); :D
    @Alex-Digital Da hast du aber ein ähnliches Problem wie bei XML. "Komplexe" Objekte kannst du damit nicht serialisieren.
    Und wieso willst du da mit Strings arbeiten? Was in der serialisierten Datei steht kann dir komplett wurscht sein. Du serialisierst das und anschließend kannst du das wieder deserialisieren. So einfach ist das. Ob in der Datei komische Zeichen stehen muss dir bei Binary egal sein. Bei XML und JSON ist das Zeug lesbar. Bei Binary nicht.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.

    thefiloe schrieb:

    Und wieso willst du da mit Strings arbeiten? Was in der serialisierten Datei steht kann dir komplett wurscht sein. Du serialisierst das und anschließend kannst du das wieder deserialisieren. So einfach ist das. Ob in der Datei komische Zeichen stehen muss dir bei Binary egal sein. Bei XML und JSON ist das Zeug lesbar. Bei Binary nicht.
    Ich möchte es deswegen gerne in Form eines Strings haben, da dieser später noch weiter bearbeitet wird. Es wäre sehr unschön, wenn ich erst in eine Datei schreibe, diese dann wieder einlese und schließlich wieder lösche, nur damit ich dass dann als String habe.
    Was willst du da bitte bearbeiten? Das Zeug ist nicht darauf ausgelegt etwas zu bearbeiten. Wenn du da was bearbeitest fliegt dir das bei der Deserialisierung um die Ohren.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    @thefiloe

    Ich kann zum Beispiel zusätzliche Informationen in den String schreiben, die ich vor der Deserialisierung wieder abschneiden kann. So kann ich unter anderem eine zweite Serialisierung anheften und das ganze dann erst in eine Datei packen. Wie dem auch sei, es hätte schon für mich einige Vorteile wenn ich das eben als String vorliegen hätte.
    In der Textdatei habe ich es doch richtig vorliegen, ich möchte ganz einfach nur das gleiche in eine Variable speichern, anstatt gleich eine Datei zu erstellen.
    Du kannst auch in einen MemoryStream schreiben und dann mit einem StreamReader daraus lesen. Außerdem ist dein Vorhaben mit dem veränder nicht ganz lupenrein.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Es wird ja auch zunächst in einen MemoryStream geschrieben. Erweitert mit einem StreamReader:

    VB.NET-Quellcode

    1. Try
    2. Dim fs As Stream = New MemoryStream()
    3. Dim bf As New BinaryFormatter
    4. If compression Then fs = New GZipStream(fs, CompressionMode.Compress)
    5. bf.Serialize(fs, instance)
    6. Dim s As MemoryStream = fs
    7. Dim streamreader As New StreamReader(s)
    8. s.Seek(0, SeekOrigin.Begin)
    9. Dim x As String = streamreader.ReadToEnd()
    10. fs.Close()
    11. streamreader.Close()
    12. Return x
    13. Catch ex As Exception
    14. MessageBox.Show(ex.Message, Application.ProductName, _
    15. MessageBoxButtons.OK, MessageBoxIcon.Error)
    16. End Try

    Gleiches (falsches) Ergebnis!

    Könntest du bitte ein wenig weiter ausführen, wieso das nicht so "Lupenrein" ist? ;)

    *alliance schrieb:

    Gleiches (falsches) Ergebnis!

    na, du schreibst mit einem BinaryFormatter in den Stream rein, und liest mit einem StreamReader aus - nu erklär mirmal, was du da anneres erwartest, als ein falsches Ergebnis.

    (serialisiertes manipulieren) wieso das nicht so "Lupenrein" ist?
    serialisierung garantiert nur, dass die Daten, sofern unangetastet, wieder deserialisiert werden können, und dann einen Klon des serialisierten Objekts ergeben.
    Vollkommen unvorhersehbar ist, wie sich die deserialisierung verhält, wenn in den Daten rumgepfuscht wurde.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Ja, ein Ergebnis mit richtiger Encoding. Angenommen ich lasse jetzt mal den FileStream drinne, sodass er eine Datei erzeugt.
    Jetzt lese ich die Datei mittels StreamReader wieder ein und ich muss feststellen, dass der Text in der Textdatei teilweise andere Zeichen hat, als der durch den StreamReader erzeugten String.
    Ich weiß nicht, ist hier vielleicht ein Fehler in meiner Logik? Geht sowas einfach nicht?
    Das versuche ich ihm auch klar zu machen :(.
    Na dann setze doch die Encodierung die du brauchst. Und hau mal den GZipStream weg. Der verwirrt nur. Außerdem ist dein Vorhaben totaler Käse. Kein Mensch macht sowas. Du kannst auch nicht einfach irgendwo was dran setzen etc. Du weißt nicht wie das Binärformat aufgebaut ist. Wenn du auf der sicheren Seite sein möchtest, dann machst du es so:
    1. Objekt1 serialisieren
    2. Stream deserialisieren
    3. Deserialisiertes Objekt1 und Objekt2 in von mir aus ein Array packen
    4. Array serialisieren
    5. --> Haste beide Objekte im Stream.

    Mit Strings darfst du hier einfach nicht arbeiten. Wenn man etwas bearbeiten möchte, dann XML oder JSON. Binär darfste nicht anfassen. Und ansonsten macht man zwei verschiedene Dateien.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.

    ErfinderDesRades schrieb:

    du schreibst mit einem BinaryFormatter in den Stream rein, und liest mit einem StreamReader aus - was erwartest du?

    *alliance schrieb:

    Ja, ein Ergebnis mit richtiger Encoding.
    Ein BinaryFormatter schreibt keinen Text, deshalb gibts da auch kein Encoding.

    ErfinderDesRades schrieb:

    deshalb gibts da auch kein Encoding.
    a) Meint er, dass irgendwie sein String da vorkommen sollte <- dem ist nicht so
    b) Macht er die Datei mit dem Editor auf welcher dann natürlich auch nen Salat darstellt. Nur eben nen anderen Salat als sein StreamReader. Was mir persönlich ja komplett wurscht wäre. Aber anscheinend versteht er das Prinzip der Serialisierung noch nicht ganz.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.