Я знаю, что вы просите библиотеку. Если вы не можете найти один (:: boggle ::, вы думаете, что это решенная проблема!), Вот схема для решения:
Вы должны быть в состоянии написать генератор кода [1] для сериализации деревьев / графиков без предварительной обработки (во время выполнения) довольно просто.
Вам нужно будет проанализировать структуру узла (typedef
обработка?) И записать включенные значения данных прямым способом, но относиться к указателям с некоторой осторожностью.
Для указателя на другие объекты (т. Е. char *name;
), на которые вы знаете ссылаетесь по отдельности, вы можете напрямую сериализовать целевые данные.
Для объектов, которые могут иметь множественные ссылки, и для других узлов вашего дерева вам нужно будет представить структуру указателя. Каждому объекту присваивается номер сериализации, который записывается вместо указателя. Поддерживать структуру перевода между текущей позицией памяти и номером сериализации. При обнаружении указателя посмотрите, не присвоен ли ему уже номер, если нет, присвойте ему один и поставьте в очередь этот объект для сериализации.
Чтение обратно также требует шага перевода узла - # / memory-location, и его может быть проще сделать за два прохода: восстановить узлы с номерами узлов в слотах указателя (плохой указатель, будьте предупреждены), чтобы выяснить, где каждый узел ставится, затем снова обходит структуру, фиксируя указатели.
Я ничего не знаю о tpl, но вы могли бы воспользоваться этим.
Формат на диске / в сети, вероятно, должен содержать информацию о типе. Вам понадобится схема искажения имени.
[1] ROOT использует этот механизм для обеспечения очень гибкой поддержки сериализации в C ++.
Позднее добавление: Мне приходит в голову, что это не всегда так просто, как я подразумевал выше. Рассмотрим следующую (надуманную и плохо продуманную) декларацию:
enum {
mask_none = 0x00,
mask_something = 0x01,
mask_another = 0x02,
/* ... */
mask_all = 0xff
};
typedef struct mask_map {
int mask_val;
char *mask_name;
} mask_map_t;
mask_map_t mask_list[] = {
{mask_something, "mask_something"},
{mask_another, "mask_another"},
/* ... */
};
struct saved_setup {
char* name;
/* various configuration data */
char* mask_name;
/* ... */
};
и предположим, что мы инициализируем struct saved_setup
предметов, так что mask_name
указывает на mask_list[foo].mask_name
.
Когда мы собираемся сериализовать данные, что мы делаем с struct saved_setup.mask_name
?
Вам нужно будет позаботиться о разработке ваших структур данных и / или привнести некоторые специфические для конкретного случая сведения в процесс сериализации.