Потерять имя при сериализации объекта - PullRequest
0 голосов
/ 23 марта 2012

Проводя некоторый эксперимент по сериализации, я заметил, что имя моего объекта теряется при извлечении объекта.Не могли бы вы показать мне, что происходит?

void nDB::serialize(macro* myMacro) {
    ofstream ar("macro.dat", ios::binary);
    ar.write((char*)myMacro,sizeof(*myMacro));
}

macro* nDB::deserialize() {
    macro* tmp_macro = (macro*)safemalloc(sizeof(macro));
    ifstream ar("macro.dat", ios::binary);
    ar.read((char*)tmp_macro,sizeof(*tmp_macro));
    printf("My macro name is %s\n",tmp_macro->get_name());
    return tmp_macro;
}

И это мой вывод

My macro name is \uffffs\uffff>

Большое спасибо,

Ответы [ 2 ]

2 голосов
/ 23 марта 2012

То, что вы делаете, это неопределенное поведение.

Вы должны не использовать прямую манипуляцию с памятью (и особенно malloc и free) в C ++, если только вы не манипулируете как C-likeструктуры (и все же ...).

Для сериализации и десериализации вам нужна соответствующая библиотека (или для ее самостоятельного кодирования, но пока у вас нет необходимых знаний).

Я бы порекомендовал использовать Boost.Serialization.

Но перед этим я бы порекомендовал прочитать учебник по C ++ (см. Список , скомпилированный здесь ).Вы не используете идиоматический C ++, вы используете C-подобные идиомы.Это тебя укусит.

0 голосов
/ 23 марта 2012

Вы храните только статическую память для вашего объекта.Любая динамически распределенная память, используемая вашим объектом (например, std::string, std::vector или что-либо, выделенное с помощью malloc или new), не будет сохранена, поскольку они находятся в куче.Вы также должны сериализовать и десериализовать всю динамически распределенную память.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...