我知道您要的是图书馆。如果你找不到(::boggle::,你会认为这是一个已解决的问题!),这里有一个解决方案的大纲:
您应该能够编写代码生成器[1] 来序列化树/图,而无需(运行时)相当简单的预处理。
您需要解析节点结构(typedef 处理?),并以直接的方式写入包含的数据值,但要小心处理指针。
回读还需要一个 node-#/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怎么办?
您需要小心设计数据结构和/或为序列化过程带来一些特定于案例的情报。