我知道你要的是一个图书馆。如果你找不到一个(:: boggle ::,你认为这是一个已经解决的问题!),这里有一个解决方案的大纲:
您应该能够编写代码生成器[1]来序列化树/图,而无需(运行时)预处理相当简单。
您需要解析节点结构(typedef处理?),并以直接的方式编写包含的数据值,但要小心处理指针。对于指向char *name;您知道单独引用的其他对象(即)的指针,您可以直接序列化目标数据。
对于可能被多次引用的对象以及树的其他节点,您必须表示指针结构。每个对象都被分配一个序列号,这是指针写入的内容。保持当前内存位置和序列号之间的转换结构。在遇到指针时,查看它是否已经分配了一个数字,如果没有,则给它一个并将该对象排队以进行序列化。
回读还需要一个节点 - #/内存位置转换步骤,并且在两次传递中可能更容易做到:用指针槽中的节点号重新生成节点(坏指针,被警告)以找出每个节点获得的位置放,然后再次走结构固定指针。
我对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?
您需要注意设计数据结构和/或为序列化过程带来一些特定于案例的智能。