Pagina 2 di 2 primaprima 1 2
Visualizzazione dei risultati da 11 a 14 su 14

Discussione: [c++]serializzazione

  1. #11
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    Originariamente inviato da MItaly
    Ma, di nuovo, esistono già diverse librerie di serializzazione, non stare a reinventare la ruota.
    il mio problema è che nelle librerie di serializzazione di qt non ho trovato(o almeno io non ho trovato) come gestire i puntatori(in modo che serializzando un puntatore alla deserializazione mi ritrovo un puntatore valido), mi consigli di passare a boost? o si puo fare qualcosa?
    scusa se non ti ho detto prima questo problema.

  2. #12
    Be' ma è normale, non esiste un modo "giusto a priori" per serializzare un puntatore... tutto il trucco è serializzare oggetti, i quali a loro volta implementano per i fatti loro la loro logica di serializzazione/deserializzazione (che so, un oggetto che, tramite puntatore, possiede un altro oggetto, lo serializzerà/deserializzerà come oggetto, non come puntatore).
    Comunque, spiega meglio che puntatori devi serializzare...
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #13
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    be, per es una classe del tipo:
    codice:
    class A
    {
        int num1;
        int num2;
    };
    class B
    {
        A* m_PointerMember
        int num1;
        int num2;
    };
    Vorrei serializzare il m_PointerMember in modo che alla deserializzazione mi ritrovo un puntatore valido ad A.
    questo è un esempio molto semplice ma è quello che vorrei fare, e potrebbe essere piu complicato ad es con puntatori membro uguali e gerarchie piu complesse.
    devo gestire io la fase di link dei puntatori oggetti con una mappa? o cose piu complicate?
    scusa ma non ho capito.

    ciao

  4. #14
    Tutto dipende da qual'è la semantica di ownership di quel puntatore... se B è l'unico proprietario di m_PointerMember allora è facile - lo serializzi/deserializzi assieme agli altri campi (ovviamente come oggetto, non come puntatore). Se la proprietà è condivisa con altri oggetti la questione è più complicata e dipende da come esattamente l'oggetto è condiviso/quanti sono i proprietari/che relazioni intercorrono tra loro. In alcuni casi la cosa più semplice può essere banalmente salvare solo i dati iniziali e ricostruire tutti gli oggetti "da zero".

    In altri casi un approccio che mi viene in mente potrebbe essere questo: ogni oggetto serializzabile deriva da una classe astratta che contiene il metodo virtuale per serializzarlo/deserializzarlo (chiamiamola Serializable). Costruisci un oggetto contenente una hashtable, del tipo std::unordered_map<Serializable *, unsigned int> e un intero che funga da "ultimo indice usato", inizialmente 0; ogni volta che serializzi un puntatore, controlli se è già stato aggiunto alla mappa e recuperi l'intero ad esso associato (operazione che è O(1) in una hashtable). Se è già presente, allora al posto di serializzare il puntatore serializzi l'indice associato, se non è presente lo aggiungi (associandoci un nuovo indice, ottenuto incrementando l'"ultimo indice usato" di 1) e fai lo stesso.
    Dopo che hai serializzato gli oggetti "veri e propri" in questa maniera, serializzi tutti gli oggetti della hashtable, preservandone l'indice in qualche maniera (o scrivi le coppie oggetto-indice, oppure scrivi solo gli oggetti in ordine di indice, operazione però più lunga)
    Nel deserializzare, prima di tutto deserializzi gli oggetti della hashtable, inserendo i relativi puntatori in un vettore in cui i vari oggetti stanno alle posizioni degli indici salvati; quindi deserializzi tutto il resto, usando gli indici letti da file per recuperare i puntatori agli oggetti costruiti nel vettore di prima.

    Per ulteriori informazioni su approcci di questo genere puoi leggere qui.
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.