Serialisieren

  • VB.NET

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

    Laut den Guidlines für guten Codestil auf Msdn solltest du keine public Variablen haben, sondern nur public Properties:

    A useful way to interpret the principle is to say that a type should be designed so that changes to fields of that type (name or type changes) can be made without breaking code other than for members of the type. This interpretation immediately implies that all fields must be private.
    Bei Read/Write-Properties macht das aber erst richtig Sinn, seitdem es Auto-Implemented Properties gibt.
    Vorher war es einfach eine Riesen-Schreibarbeit um wenig Effekt.

    Für mich spielen Properties die eigentlichen Stärken aus
    - wenn sie ReadOnly (oder -eher seltener- WriteOnly) verwendet werden.
    - wenn deren Code mehr als nur die Zuweisung einer privaten Variablen enthält
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Jetzt aber zurück zu meinem eigentlichen Problem:
    Das NonSerialisized funktioniert nicht.
    Ich habe dann mal auf der entsprechenden MSDN - Seite gesucht.
    Da stand dann ein link, dass ich beim XMLSerialisierer <XmlIgnore()> benutzen muss.
    Das hat in der Test-Klasse wunderbar geklappt 8o .
    In der "world" Klasse aber nicht :( .
    Woran könnte das liegen? Ich habe alle Dictionarys und Unterobjekte ignorieren lassen. Jetzt gibt es nur noch drei Integer, einen String und ein paar Subs und Funktionen. Muss man die auch ignorieren lassen?


    Das mit dem

    petaod schrieb:

    Auto-Implemented Properties
    ist eine tolle Funktion. Ab jetzt werde ich keine öffentlichen Variablen, sondern nur noch Propertys benutzen.

    EDIT:
    Wartet, eine ganz unbedeutende eigene Klasse war noch drin und genau daran liegt das Problem!
    Darin war ein Dictionary, das ich noch nicht ignorieren lassen habe. Das habe ich dann schleunigst nachgeholt, aber es funktioniert immer noch nicht ?( .
    In der Klasse namens "Field" befinden sich nur (noch) zwei Stings und ein paar Funktionen. Liegt es vieleicht an einem 2-Dimensionalen Array?

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

    Das ist die allerbeste Option.

    Da ich mich auf dieser Seite einloggen müsste, habe ich es auf einer anderen heruntergeladen.
    Aber ich habe ein Problem.
    Es gibt drei verschiedene Versionen und im readme.txt steht:

    readme.txt schrieb:

    In .NET Compact Framework reference the
    Polenter.SharpSerializer.Compact.dll

    In Silverlight reference the
    Polenter.SharpSerializer.Silverlight.dll

    Otherwise reference
    Polenter.SharpSerializer.dll
    Welches soll ich jetzt nehmen? Ich benütze Microsoft VisualBasic 2010Express.
    Hallo,

    @phil:

    Nimm das letzte, das erste brauchst du für Mobilgeräte und das
    Zweite für Web-Anwendungen.

    MFG

    Alex-Digital :D
    ~ Alex-Digital :D

    if(!Internet.VBP.Get<User>("Alex-Digital").IsOnline) this.Close(); :D
    Nein, für Windows das letzte,
    für Handy oder Smartphones mit Windows
    und das Zweite fürs Internet.

    Du musst das Letzte verwenden.

    MFG

    Alex-Digital :D
    ~ Alex-Digital :D

    if(!Internet.VBP.Get<User>("Alex-Digital").IsOnline) this.Close(); :D
    Der sharpSerialisizer ist richtig gut. :thumbsup:
    Allerdings hat er einen Haken, und zwar reagiert er nur auf Properties, und nicht auf öffentliche Variablen.
    Jetzt sieht mein Test gerade so aus:

    VB.NET-Quellcode

    1. <Serializable()>
    2. Public Class Test
    3. Property x As Integer = 0
    4. Property obj As Test2 = New Test2(9)
    5. Property dic As Dictionary(Of String, Integer) = New Dictionary(Of String, Integer)
    6. Sub New()
    7. End Sub
    8. Sub New(ByVal y As Integer)
    9. x = y
    10. dic.Add("Test", 1)
    11. obj.x = 4
    12. End Sub
    13. End Class
    Es ist etwas komisch, dass ich Unterobjekte als Property deklarieren muss, aber wenns sein muss...
    Ein Problem hätte ich noch: Arrays kann man nicht als Property deklarierten :cursing:


    Jetzt noch eine letzte Frage:
    Muss ich mehr als folgende Schritte machen, um eine eigene Dateiendung zu haben?
    - Es unter dem Dateinamen .game (Beispiel) abspeichern
    - Unter Windows Explorer: Öffnen mit -->Standardprogramm auswählen
    - Die Parameter beim Programmstart abfragen

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

    Ich finde den sharpSerializer richtig blöd, wenn man mit ihm nur Properties serialisieren kann.
    Und Arrays kann man ja nicht als Property deklarieren, wie ist es dann möglich, auch 2D-Arrays zu serialisieren?
    Oder habe ich da einen Denkfehler?
    irgendwie fings mit einem ganz kleinen Problem an "eben mal ein klein Objekt abspeichern", und nu kommt man an die Grenzen von Serialisierung - mit Dictionaries und mehrdimensionalen Arrays.

    Tja, ein Spiel basiert halt am besten auf einem relationalem Datenmodell der Spiel-Welt, mittm typisierten Dataset wäre ein Abspeichern dann auch kein Thema.

    naja - man könnte glaub recht leicht auch serialisierbare Dictionaries proggen, und vlt. kann man das mehrdim Array auch durch ein sog. "jaggedArray" ersetzen, also durch ein Array von Arrays.

    Bist du dir sicher, dasses das jetzt alles ist, worans scheitert: Dictionary und mehrdim-Array?
    Mit dem sharpSerializer sind es gerade Arrays generell, an denen ich scheitere. (zumindest ein eindim. Array hat mit dem XMLSerialisierer schon funktioniert)
    So funktioniert es nicht:

    VB.NET-Quellcode

    1. Dim players(2) As Player
    2. Public Property propertyPlayers(ByVal index As Integer) As Player
    3. Get
    4. Return players(index)
    5. End Get
    6. Set(value As Player)
    7. players(index) = value
    8. End Set
    9. End Property
    --> kein Fehler, wird aber auch nicht abgespeichert
    Kann ich vielleicht die

    Aber so auch nicht:

    VB.NET-Quellcode

    1. Property players(2) As Player
    --> Fehlermeldung gleich im Code



    @ErfinderDesRades
    Ich habe nicht behauptet, das dieses Objekt klein ist ;) .

    ErfinderDesRades schrieb:

    Tja, ein Spiel basiert halt am besten auf einem relationalem Datenmodell der Spiel-Welt, mittm typisierten Dataset wäre ein Abspeichern dann auch kein Thema.
    Das sind mir zu viele Fachbegriffe:
    Was heißt relationales Datenmodell und typisiertes Dataset?
    Ich habe schon danach gegoogelt, aber nichts richtig verstanden ?( . Ich habe es so verstanden, dass alle Variablen in einer Tabelle gespeichert werden. Was macht das für einen Sinn?

    Und (auch) ich hoffe, dass das jetzt schnell erledigt ist und ich weiter an meinem Projekt programmieren kann.
    also auf Wiki müsste sich eiglich was zu relationale Datenbank finden lassen, alle üblichen Datenbanken sind relational.
    Leider können Datenbänker wohl nicht gut erklären, daher habichs auch selbst einmal versucht: die relationale GrundIdee

    Das wird eine neue Welt für dich sein, und vmtl. wirst du deine Architektur nicht umstellen wollen.

    phil schrieb:

    Und (auch) ich hoffe, dass das jetzt schnell erledigt ist und ich weiter an meinem Projekt programmieren kann.
    ja, wie isses nun, gibts noch mehr Störfaktoren als Dicts und 2dim-Arrays?
    Und kannst du auf Dicts abzuspeichern verzichten?
    Dicts und das 2D Array (nur eines) könnte ich beim abspeichern weglassen, ich müsste sie aber nach dem Deserialisieren mühevoll wieder bestücken.
    Den sharpSerialisizer finde ich eigentlich gut, da funktionieren die Dictionarys, nur die Arrays fehlen noch. Vielleicht hast du ja eine Lösung für mein oben dargestelltes Problem.
    Wenn nicht, mache ich es halt mit dem XMLSerialisierer.
    Problem solved:

    VB.NET-Quellcode

    1. Private Sub BinaryFormatting()
    2. Dim varTest As New Test(2)
    3. Dim bf As New BinaryFormatter
    4. Using strm As New FileStream(".\test.txt", FileMode.Create)
    5. bf.Serialize(strm, varTest)
    6. End Using
    7. Using strm As New FileStream(".\test.txt", FileMode.Open)
    8. Dim varTest2 = DirectCast(bf.Deserialize(strm), Test)
    9. Nop()
    10. End Using
    11. End Sub
    12. <Serializable()> _
    13. Public Class Test
    14. Public x As Integer = 0
    15. Private _Dic As New Dictionary(Of Integer, Integer)
    16. Public ReadOnly Property DDic As Dictionary(Of Integer, Integer)
    17. Get
    18. Return _Dic
    19. End Get
    20. End Property
    21. Public Arr As Integer(,) = {{4, 5}, {4, 5}}
    22. Public Arr2 As Integer()() = {New Integer() {4, 5}, New Integer() {4, 5}}
    23. Sub New()
    24. End Sub
    25. Sub New(ByVal y As Integer)
    26. Call 4.Times(Sub(i) _Dic.Add(i, i))
    27. x = y
    28. End Sub
    29. End Class
    BinaryFormatter hat mit deine Problem-serialisierungen kein Problem. Serialisiert sogar private Member.
    Die Datei ist zwar nicht menschen-lesbar, aber Menschen richten in solchen Dateien eh nur Chaos an ;).