Serialisierung sich verändernder Objekte



  • Ich arbeite mit boost/serialization um Objekte in XML Dateien zu archivieren. Dabei habe ich einen Zeiger auf das Objekt und übergebe ihn dem Archiv. Was dabei heraus kommt ist genau das was ich will:

    <BeispielModul1 class_id="1" tracking_level="1" version="0" object_id="_2">
      <Modulname>BeispielModul1</Modulname>
      <DatenArt>BeispielDaten1</DatenArt>
      <laufen>1</laufen>
      <Taktlaufzeit>222901</Taktlaufzeit>
      ..
    </BeispielModul1>
    

    Allerdings arbeite ich taktbasiert und die Objekte verändern sich in jedem Takt! Genau das möchte ich als nachvollziehbare Historie abspeichern. Wenn ich den selben Zeiger aber ein zweites Mal serialisieren möchte kommt nur noch das heraus:

    <BeispielModul1 class_id_reference="1" object_id_reference="_2"></BeispielModul1>
    

    Das ist natürlich sehr unbrauchbar. Sieht aus wie ein Verweis als XML. Kann man das irgendwie abstellen?



  • Wenn ich den selben Zeiger aber ein zweites Mal serialisieren möchte kommt nur noch das heraus

    Ja, klar, das soll ja auch so sein.
    Boost.Serialization ist ja keine Logging- oder XML-Generierungs-Lib, sondern eben eine Serialisierungs-Lib.
    Und da will man, wenn man "Graphen" speichert, in denen das selbe Objekt mehrfach referenziert wird, die Daten dieses Objekts halt nur 1x speichern. (Da man nach dem Reinladen wieder einen equivalenten Graphen haben möchte, wo das Objekt ebenfalls nur 1x vorkommt, aber halt mehrfach referenziert wird)

    Schliess' die Serialisierung ab (k.A. wie das mit Boost.Serialization genau geht, vermutlich mit archive.close() + Zerstören von archive oder so), und fang eine neue an.

    ps: jede (mir bekannte) Serialisierungs-Lib geht davon aus dass ein "Snapshot" gespeichert wird, also dass sich während des gesamten Serialisierungs-Vorganges nichts an den Daten ändert. Wenn du trotzdem etwas änderst, führt das natürlich zu Problemen.
    Also passe deine Vorgehensweise so an, dass du während eines Serialisierungs-Vorganges eben nichts änderst, oder verwende eine andere Lib zum speichern der Daten. z.B. eine "einfache" XML-Lib (TinyXML, Xerces - was auch immer).



  • Die Lösung lautet Objekt-Tracking und wird hier beschrieben: http://www.boost.org/doc/libs/1_37_0/libs/serialization/doc/traits.html


Log in to reply