Sfortunatamente la risposta è che non esiste un modo semplice per serializzare qualsiasi cosa con i puntatori in esso, perché il layout di memoria dei dati è probabile che sia diverso quando lo si carica di nuovo. Un serializzatore in grado di gestire i puntatori dovrebbe essere molto intelligente e creare un "layout di memoria" per salvare su disco che contiene indirizzi di puntatori validi per la struttura archiviata, e che poi li ha riscritti quando la struttura è stata deserializzata per ottenere i puntatori che puntano a i posti giusti dopo il caricamento è completo.
La parte davvero divertente è che se si consentono i puntatori nelle strutture serializzabili, è necessario essere in grado di gestire i grafici di riferimento ciclici. Inoltre, shared_ptr
mantiene i conteggi interni dei riferimenti e le informazioni contabili in modo che sappia quando distruggere un oggetto, quindi il serializzatore dovrebbe sapere tutto su come funziona, per registrare correttamente i conteggi dei riferimenti (e ignorare i riferimenti dagli oggetti shared_ptr
che non sono all'interno dell'albero serializzato ma puntano a pensare al suo interno).
Fondamentalmente è un enorme mal di testa, ed è per questo che le librerie di serializzazione non lo fanno di default. Di solito, quando vuoi farlo, hai bisogno di un comportamento personalizzato piuttosto specifico, quindi ti lasciano il compito di implementarlo per assicurarti che sia fatto correttamente.
fonte
2012-03-30 14:04:33
Forse intendevi scrivere 'boost :: shared_ptr' piuttosto che' std :: shared_ptr'? – aldo
sì, inizialmente mi piacerebbe usare std :: shared_ptr, ma con boost :: shared_ptr e corretto #include tutto va bene quindi rimarrò con boost, grazie per il tuo commento. – Guillaume07