序列化 c语言,用C语言序列化数据结构

我知道你要的是一个图书馆。如果你找不到一个(:: 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?

您需要注意设计数据结构和/或为序列化过程带来一些特定于案例的智能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值