Serialisieren

  • VB.NET

Es gibt 60 Antworten in diesem Thema. Der letzte Beitrag () ist von phil.

    Hallo

    ich habe mich mal noch genauer in MSDN den GetType-Operator angeschaut.
    Dort steht folgendes:
    Sie können den Namen eines beliebigen Typs übergeben, der in typename definiert ist.
    Hierzu gehören folgende Elemente:
    - ein paar andere Punkte
    - Eine beliebige Klasse, Struktur, Schnittstelle bzw. ein beliebiges Modul, die von der Anwendung definiert werden.

    Muss man das machen, oder macht das die Anwendung automatisch?
    Wenn man selbst Hand anlegen muss, wie geht es?
    da musste nix machen

    msdn schrieb:

    - Eine beliebige Klasse, Struktur, Schnittstelle bzw. ein beliebiges Modul, die von der Anwendung definiert werden.
    scheint mir eine umständliche Formulierung für "eine Klasse, dies auch gibt"

    rückfrage: hast du denn inzwischen mal ühaupt was (de-)serialisieren können?
    Also:

    Ich habe ein neues Objekt angelegt:

    VB.NET-Quellcode

    1. <Serializable()>
    2. Public Class Test
    3. Dim x As Integer = 0
    4. Sub New()
    5. End Sub
    6. Sub New(ByVal y As Integer)
    7. x = y
    8. End Sub
    9. End Class

    Dann habe ich dieses Objekt folgendermaßen serialisiert: (kein Fehler aufgetreten :) )

    VB.NET-Quellcode

    1. Dim varTest As New Test(2)
    2. Dim writer As New StreamWriter(".\test.xml")
    3. Dim serializer As New XmlSerializer(varTest.GetType)
    4. serializer.Serialize(writer, varTest)
    5. writer.Close()

    Und es so deserialisiert: (auch kein Fehler :) )

    VB.NET-Quellcode

    1. Dim varTest As New Test(1)
    2. Dim reader As New StreamReader(".\test.xml")
    3. Dim deserializer As New XmlSerializer(varTest.GetType)
    4. varTest = CType(deserializer.Deserialize(reader), Test)
    5. reader.Close()

    In der letzten Zeile vom deserialisieren habe ich das Programm per Haltepunkt angehalten, um zu testen, welchen Wert x hat.
    x hatte den Wert: "0" :cursing: --> müsste "2" sein!

    Hat jemand eine Idee?



    EDIT:
    zu meinem world ist mir gerade eine Idee gekommen:
    Könnte es daran liegen, dass alle Unterklassen Serializable gemacht werden müssen?

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

    ErfinderDesRades schrieb:

    mach x public, dann gehts
    Danke, das war ein super Tipp! :thumbsup:
    Jetzt funktioniert es. - Mit der Test-Klasse.

    Als nächstes werde ich eine nicht - serialisierbare Unterklasse einfügen, um zu schauen, ob diese auch serialisierbar sind.

    EDIT: --> ausprobiert:
    - Jede Unterklasse muss Serialisierbar sein
    - Jede Unterklasse muss einen parameterlosen Konstruktor haben
    => alles in der Testklasse funktioniert :) 8-) :D :rolleyes: :thumbsup: :thumbup: 8o ^^
    jetzt werde ich alle Unterklassen von meiner "world" an diese Bedingungen anpassen und mich dann wieder melden.
    =>So, das hätte ich jetzt, aber es funktioniert leider nicht :( .
    Was könnte man denn noch alles ausprobieren? -hängt es an dem Dictionary?


    Weiß jemand, wie man die Überschrift von "eigene Dateiendung" zu "Serialisieren" ändert?

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „phil“ ()

    Ich habe es ausprobiert:
    Wenn ich in die Test-Klasse ein Dictionary einbinde, funktioniert es nicht mehr :( .
    Kann man das vielleicht umgehen, ich könnte mir z.B. vorstellen,
    dass man eine eigene Klasse schreibt, die alles von Dictionary erbt und zusätzlich einen parameterlosen Konstruktor (in diesem Fall das störende Element) hinzufügt.
    Oder ist das eine richtig absurde Idee?
    Ein Dictionary ist eine generische Klasse. Welche Typen verwendest du? Wenn sich die nicht serialisieren lassen, lässt sich auch das Dictionary nicht serialisieren.
    Du kannst auch einzelne Felder von der Serialisierung mit dem [NonSerialized]-Attribut ausschließen.
    Wenn du ans Weglassen denkst - vergiss es!
    Ich habe es erst in diesem Projekt (bei meinem vorletzten Thema in vb.paradise) kennengelernt und natürlich sofort und oft eingebaut - ist ja auch nützlich!



    Infinity schrieb:


    Du kannst auch einzelne Felder von der Serialisierung mit dem [NonSerialized]-Attribut ausschließen.
    Wie geht das? Das wäre die beste Lösung. :thumbup:
    Und: Ich benütze String, Integer und eigene Klassen


    Jetzt gehe ich ins Bett, also bis Morgen.
    insgesamt weglassen auf keinen Fall.
    Nur vielleicht aus der Serialisierung weglassen.

    Oft wird Dictionary auch für Kram missbraucht, den auch einfachere Klassen abhandeln könnten.
    Also wennich frag "Wozu brauchst du Dictionary?", dann lohnt es sich vlt., die Frage einfach zu beantworten, statt zu denken, was ich denke ;)

    Aber ich präzisiere: Wozu brauchst du ein Dictionary innerhalb deiner World?
    Ausschließen von Feldern für die Serialisierung geht ganz einfach:

    VB.NET-Quellcode

    1. <Serializable()>
    2. Public Class Test
    3. Dim x As Integer = 0
    4. <NonSerialized()>
    5. Public d As Dictionary(Of String, Integer)
    6. Sub New()
    7. End Sub
    8. Sub New(ByVal y As Integer)
    9. x = y
    10. d = new Dictionary...
    11. End Sub
    12. End Class


    Allerdings sollte sich ein String-Integer-Dictionary eigentlich serialisieren lassen.

    Infinity schrieb:

    Ausschließen von Feldern für die Serialisierung geht ganz einfach:

    Das funktioniert aber nicht :( : (ich habe es ausprobiert)

    VB.NET-Quellcode

    1. <Serializable()>
    2. Public Class Test
    3. Public x As Integer = 0
    4. Public obj As Test2 = New Test2(9)
    5. <NonSerialized()>
    6. Public dic As Dictionary(Of Integer, Entity) = New Dictionary(Of Integer, Entity)
    7. Sub New()
    8. 'dic.Add(0, Entity0)
    9. 'dic.Add(1, Entity1)
    10. 'dic.Add(2, Entity2)
    11. End Sub
    12. Sub New(ByVal y As Integer)
    13. 'dic.Add(0, Entity0)
    14. 'dic.Add(1, Entity1)
    15. 'dic.Add(2, Entity2)
    16. x = y
    17. End Sub
    18. End Class



    ErfinderDesRades schrieb:

    Nur vielleicht aus der Serialisierung weglassen.
    Das wäre Ok.
    Ich benutze die Dictionarys folgendermaßen:
    Ich habe verschiedene Spielfiguren, die alle eine Nummer haben.
    Im Konstruktor ordne ich dann diesen Integern mit Dictionary(Of Integer, Entity) verschiedene Spielfiguren (eigene Klasse) zu. -siehe auskommentierte Codezeilen
    Dies bleibt immer gleich und ist nicht von Variablen abhängig.
    Kann man das irgendwie besser machen?
    Könnte ich das jetzt zusätzlich in den parameterlosen Konstruktor schreiben, wie oben angedeutet, und es wird bei der Deserilisation automatisch erstellt?

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „phil“ ()