2012-03-30 21 views
9

Ho un oggetto che il seguente campo:spinta serializzare e std :: shared_ptr

boost::unordered_map<std::string, std::shared_ptr<Foo> > m_liste_; 

Vorrei serializzare esso, ma sembra std :: shared_ptr non può essere serializzato in modo semplice

qualcuno ha una soluzione?

+0

Forse intendevi scrivere 'boost :: shared_ptr' piuttosto che' std :: shared_ptr'? – aldo

+0

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

risposta

11

ho il sospetto si sta perdendo un include,

#include <boost/serialization/shared_ptr.hpp> 

link, at the bottom

Inoltre, l'esempio lo fa apparire come aliasing e cicli sono curati per impostazione predefinita.

_OF Naturalmente, avere cicli porterà a potenziali perdite di memoria con shared_ptr che non hanno nulla a che fare con la serializzazione, e si dovrà ancora di ascoltare quelli (da cicli di evitare o uso giudizioso di weak_ptr) _

See anche:

+0

intuizione davvero buona – Guillaume07

-5

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.

+1

Ora, stai suggerendo che la Serializzazione boost non è in grado di far fronte alle complessità menzionate? Sono abbastanza sicuro che possa. Vedi la demo del tutorial: http://www.boost.org/doc/libs/1_49_0/libs/serialization/example/demo.cpp – sehe

+0

Nulla in quell'esempio serializza nulla con i puntatori al suo interno, salvo per i contenitori STL (che ovviamente usano loro internall), che note esplicitamente hanno già un supporto specifico nella libreria di serializzazione. Tuttavia, questo esempio mostra come fornire un comportamento di serializzazione per i propri tipi, che è l'hook che si usa per serializzare tutto ciò che la libreria non può gestire con la sua conoscenza predefinita. –

+0

'std :: list > ​​schedule;' e 'typedef bus_stop * bus_stop_pointer; std :: list fermate; '- e ** yes ** le fermate dell'autobus sono condivise tra i percorsi. Mi chiedo che link hai cliccato? – sehe

Problemi correlati