Я пытаюсь повысить:: сериализовать структуры, которые указывают на объекты (скажем, класса символов), реализующие идею единственного экземпляра для уникального «чего-то». Это означает, что эти объекты создаются не напрямую, а с использованием статического метода symbol::get(). Этот метод извлекает существующий объект из некоторого глобального словаря или при необходимости создает новый объект.
Теперь самое сложное заключается в том, что в моей системе есть много больших структур с указателями на такие символы. Структуры не помещаются все в памяти одновременно. Поэтому мне нужно последовательно построить, предварительно обработать и сериализовать каждую из структур отдельно. Позже я буду десериализовать и обрабатывать структуры по запросу.
Стандартные методы boost::serialize, а именно load(...) и save(...) здесь не работают. При десериализации структуры теряется общесистемная уникальность символов, а сериализация занимает много места (мои объекты-символы довольно большие). Я прочитал документы о повышении и обнаружил, что для нестандартных конструкторов я могу использовать функции save_construct_data и load_construct_data. Но в документах также говорится, что load_construct_data по умолчанию «просто использует конструктор по умолчанию для инициализации ранее выделенной памяти». Так что опять не то.
Вопрос в том, как я могу обойти эту функцию загрузки, чтобы я мог избежать любого распределения и вместо этого использовать мой symbol::get()? А может быть есть более элегантное решение?
РЕДАКТИРОВАТЬ: прикрепил простой код, демонстрирующий проблему.
struct structure_element {
};
class symbol : public structure_element {
symbol(string x);
map<string, symbol> known_symbols;
public:
static symbol *get(string x) {
if (known_symbols.find(x) != known.symbols.end()){
known_symbols[x] = symbol(x);
}
return &known_symbols[x];
}
}
class structure_node : public structure_element {
set<symbol *> some_attributes;
vector<structure_element *> children;
}