Serialisierung ...



  • Wie kann man bei VC++, MFC, dynamische Datenstrukturen ( zB Bäume ) serialisieren bzw deserialisieren ? Bei C# geht das ! Auch so, dass Referenzen korrekt gespeichert bzw geladen werden. Eine ( etwas unschöne ) Idee ist, dass man die Datenstruktur in einem Array hält, und das gesamte Array schreibt, bzw liest. Weiss jamand eine schönere Lösung ?


  • Mod

    Ja. Natürlich...
    Aber das muss man nicht mit der MFC machen, aber der CObject Serialisierungs-Code erlaubt das ohne Probleme.



  • Nur weiss man nicht wie gross so ein Baum wird, so dass man zu Entwurfszeit ein ausreichend grosses Array bereitstellen kann. Zu gross sollte es auch nicht sein zB 1GB. Kann man bei VC++ MFC, Arrays dynamisch anpassen ? Glaube ich nicht !


  • Mod

    Was hat ein Baum mit einem Array zu tun.
    Ein Baum wird dynamisch serialisiert. Wie entscheidest Du doch in Deiner Datenstruktur.
    z.B: Knoten, Linker Ast, Rechter Ast.

    Die Daten werden gestreamt in ein CFile Objekt. was auch immer das ist (Auch CMemFile...).



  • Was ich nicht verstehe ist, dass wenn ich den Baum dynamisch serialisiere und anschliessend deserialisiere, und der Baum an eine andere Stelle im Speicher geladen wird, stimmen ja die Zeiger nicht mehr ???


  • Mod

    Die Daten werden doch mit gespeichert und beim Deserialisieren wieder neu angelegt und verlinkt...



  • Boy schrieb:

    Was ich nicht verstehe ist, dass wenn ich den Baum dynamisch serialisiere und anschliessend deserialisiere, und der Baum an eine andere Stelle im Speicher geladen wird, stimmen ja die Zeiger nicht mehr ???

    Serialisieren != memcpy.
    Wenn du Zeiger hast, dann muss dein Serialisierungscode das entsprechend berücksichtigen.



  • Boy schrieb:

    Kann man bei VC++ MFC, Arrays dynamisch anpassen ? Glaube ich nicht !

    Doch, MFC-CArray bietet die Methode "add". (Ist zwar widersinnig, ein Array nach seiner Definition noch in seiner Größe zu verändern, aber MS macht gerne sein eigenes Ding. Besser wäre hier statt des Namens "Array" irgendwas anderes gewesen).
    CArray ist erstmal für Objektelemente der Klassen CObject bzw. deren Subklassen gedacht, es gibt aber auch speziell "typisierte" CArray wie

    CByteArray
    CUIntArray
    CWordArray
    CDWordArray
    CStringArray
    CPtrArray
    ...
    


  • Man kann in einem Array einen Baum speichern.

    struct Knoten { CString Eintrag; int links; int rechts; };
    Knoten BaumArray[MAXLENARRAY];
    int BaumArrayLevel;

    Und dann verschiedene Member zum Eintrag, Löschen, Suchen usw einrichten.
    Die int Variable links und rechts verweisen in das BaumArray auf andere Knoten.
    Damit hat man den Baum in einem Array gelegt. Nur weiss man zur Entwurfszeit
    nicht wie gross das BaumArray wirklich wird.



  • Martin Du hast geschrieben:

    Die Daten werden doch mit gespeichert und beim Deserialisieren wieder neu angelegt und verlinkt...

    Genügt es, wenn ich die Wurzel serialisiere, bzw deserialisiere:

    ...Serialize( ar ...
    ar << Wurzel

    Oder muss ich einen Tiefezuerstdurchlauf durchführen, und jeden Knoten einzeln
    serialisieren ? Die Referenzen würden deiner Meinung nach beim Deserialisieren
    wieder gerichtet.



  • Bei C# geht es folgendermasen:

    Serialisierung:
    CBaum bm = new CBaum();
    bm.GeneriereBaum();
    Filestream fs ...
    BynaryFormatter bf ...
    bf.Serialize(fs, bm);

    Deserialisierung:
    CBaum bm;
    FileStream fs ...
    BynaryFormatter bf ...
    bm = bf.Deserialize(fs);

    Bei VC++ MFC ähnlich ?


Log in to reply