3 回答
TA贡献1809条经验 获得超8个赞
我知道你要的是一个图书馆。如果你找不到一个(:: 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
?
您需要注意设计数据结构和/或为序列化过程带来一些特定于案例的智能。
- 3 回答
- 0 关注
- 1104 浏览
添加回答
举报