Serialisieren einer ReadOnly Property

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    Serialisieren einer ReadOnly Property

    Moin,

    ich exportiere aus meinem Programm Objekte, welche auch ReadOnly Properties beinhalten, als Xml Datei.

    Die Objekte serialisiere ich mit einer im Objekt integrierten Funktion ToXml:

    VB.NET-Quellcode

    1. Dim Serializer As New XmlSerializer(GetType(Data))
    2. Using Stream As New IO.FileStream(FileStr, IO.FileMode.Create)
    3. Serializer.Serialize(Stream, Me)
    4. End Using


    ReadOnly Properties werden mit dem XmlSerializer allerdings nicht mit in die Datei geschrieben.
    Macht auch Sinn, da eine Xml Datei in beide Richtungen funktionieren muss, damit der XmlSerializer die Daten aus der Datei auch wieder in die Eigenschaften des Objekts schreiben kann, was bei ReadOnly nicht klappt.

    Eine Möglichkeit für eine Pseudo-ReadOnly Property wäre ...

    VB.NET-Quellcode

    1. Public Property ID As Integer
    2. Get
    3. With Me
    4. Return _ID
    5. End With
    6. End Get
    7. Set(value As Integer)
    8. End Set
    9. End Property


    Damit würde die Eigenschaft ID zumindest in die Xml-Datei geschrieben, aber nicht wieder ausgelesen werden beim Import.

    Wichtig ist mir, dass die ID nicht von außerhalb des Objektes geändert werden kann, was durch den leeren Set ja der Fall ist.

    Es funktioniert soweit wie ich es mir vorstelle, aber ist das der richtige Weg, oder geht es auch besser?

    Grüße :)
    @BlueLagoonX Entweder Du lässt den Setter weg oder Du machst den Setter Private.
    Soll die Klasse serialisiert werden?
    Da muss die Property voll zugreifbar sein, nicht readonly.
    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!
    Den Setter auf Private setzen sollte wirklich funktionieren, danke für den Tipp.
    Ja die komplette Klasse soll serialisiert werden (oben ist nur ein Beispiel).
    Ich benötige nur die Klasse > Xml Richtung, einlesen will ich es selber nicht. Ist für einen Kunden gedacht, der die Datei in seiner WaWi einlesen will.

    Den Setter möchte ich als ReadOnly, damit ich im Code selber sehe, welche Eigenschaften meiner Klasse im initialisierten Objekt geändert werden dürfen und welche nicht.

    @ErfinderDesRades
    Die Xml-Attribute werde ich mir mal genauer anschauen, da gibts ja wirklich einiges.
    Nur zur Sicherheit: Warum eine Property serialisieren, die Du beim Deserialisieren nicht mehr haben willst? Oder hab ich das falsch verstanden?
    Mein Problem mit XML-Serializer: keine Private Properties de-/serialisier
    Mein Problem mit BinaryFormatter: Es wird das Objekt gespeichert, nicht nur dessen Daten (was mein Problem dabei ist, werd ich hier nicht erläutern); außerdem muss man jede Klasse mit nem Attribut versehen :thumbdown:
    Ich nehm seit einiger Zeit den JSonSerializer. Der nimmt auch ohne Attibutierung der Klasse die Private Properties her. Der hat alles, was ich brauche.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Deserialisieren will ich die Xml Datei nicht mehr, die Daten sind für einen Kunden der sie selber in seine WaWi importieren möchte.

    Ich verwende Private Properties eben für das was sie sind, Private. Dass die nicht durch den durch XmlSerializer mit serialisiert, passt mir bisher gut.

    Den BinaryFormatter habe ich mir bisher noch nicht angesehen, kommt aber mit auf die Liste für den Winter.

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

    @VaporiZed Beim BinaryFormatter gibt es das Attribut [NonSerialized], das ist sehr hilfreich.
    @BlueLagoonX Wenn der Kunde sie deserialisieren soll, solltest Du ihm die Klasse im Quellcode geben,
    was gleichbedeutend ist, dass Du selbst sie deserialisierst.
    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!
    @RodFromGermany: Ich wollte damit sagen: Mit dem JSonSerializer komm ich ganz ohne Attribute aus - was genau nach meinem Geschmack ist. Das lässt sich bei dem alles über Methoden vorkonfigurieren.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.