免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: iunknown
打印 上一主题 下一主题

[C] SPDataPickle: C语言的结构体和 xml/json/protobuf 的自动转化(移植到 win32 平台) [复制链接]

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
21 [报告]
发表于 2014-11-07 15:42 |只看该作者
本帖最后由 yulihua49 于 2014-11-07 15:43 编辑
xphh2008 发表于 2014-11-06 22:38
那么多年过去了,不知道楼主还在么嘿嘿

最近因为项目需求,我也需要一个类似protobuf的东西。但是因 ...

尝试值得鼓励。
问题:
不是普通的原生态的结构。
每一个结构都要做一个元数据生成。
我的做法:
1.使用原生态的结构。
2.直接使用生成好的模板,不需要再走一遍生成。但是有一个隐式的模板初始化。

模板生成器是外置的,生成好的文件被应用程序include即可。

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
22 [报告]
发表于 2014-11-07 16:09 |只看该作者
我觉得csv不错。适合传统的SQL数据库。json适合NOSQL数据库。都不错。

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
23 [报告]
发表于 2014-11-07 16:10 |只看该作者
我写了一个轻量的SQL数据库服务器就是使用CSV传输数据。

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
24 [报告]
发表于 2014-11-07 16:11 |只看该作者
CSV数据生成、解析就是几十行的代码。相当轻量。

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
25 [报告]
发表于 2014-11-07 16:26 |只看该作者
本帖最后由 yulihua49 于 2014-11-07 16:45 编辑
cobras 发表于 2014-11-07 16:09
我觉得csv不错。适合传统的SQL数据库。json适合NOSQL数据库。都不错。

csv不如用分隔符的字符串,那个引号转意规则处理起来开销很大的。
json做关系数据库也很好,带着列名,解析很方便。
csv解析也就十几行,但是解析开销一点不比json少。
json的解析就一行,至于里边是几百行或几千行,跟我没关系。

JSON_OBJECT json=json_tokener_parse(rqst);
int ret;
DAU dau;
      ret=DAU_init(&dau,SQL_Connect,tabname,NULL,NULL);//dau特化成数据库表tablename
char stmt[10240];//生成语句的空间

然后反序列化:

DAU_fromJSON(&dau,json,NULL);//json按列名装载到dau里边的Record
*stmt=0;
ret=DAU_insert(&dau,stmt);//插入到数据库
......
commit;

完了,就这么简单。
DAU_free(&dau);
json_object_put(json);

DAU_init时,用tabname的数据字典生成模板和数据结构->dau。
后来的所有操作都依靠模板。

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
26 [报告]
发表于 2014-11-07 16:45 |只看该作者
josn也有字符串对象。也需要引号ESC。相比较,CSV的引号转义更简单。另外的说的代码量是从0写的代码量。不是调用什么库的。
因为csv就是为数据库而生的。一行一条记录。一节一个字段。所以CSV适用于SQL,而且冗余代码少。控制代码就只有',','"'和'\n'三种。而json就多了去了。
CSV而且是迭代的。而json是递归定义的。

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
27 [报告]
发表于 2014-11-07 16:47 |只看该作者
本帖最后由 yulihua49 于 2014-11-07 16:49 编辑
cobras 发表于 2014-11-07 16:45
josn也有字符串对象。也需要引号ESC。相比较,CSV的引号转义更简单。另外的说的代码量是从0写的代码量。不是 ...

上边说了二者解析开销差不多。json更方便些。数据量json大一些,但是,在我们的中间件里,传输是压缩的,压缩后各种格式大小差不多。
XML的解析明显要慢。
有轮子何必自己造。csv也有解析器,不过得自己找。

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
28 [报告]
发表于 2014-11-07 16:49 |只看该作者
递归定义有个缺点,就是需要将整个数据缓存才通解析。而迭代定义的就没有这个问题,完全是流式的,走到哪黑就在哪歇。

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
29 [报告]
发表于 2014-11-07 16:50 |只看该作者
这两种我都自己写了一套解析库。所以比较了解。还有xml也是递归定义的。

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
30 [报告]
发表于 2014-11-07 16:51 |只看该作者
cobras 发表于 2014-11-07 16:49
递归定义有个缺点,就是需要将整个数据缓存才通解析。而迭代定义的就没有这个问题,完全是流式的,走到哪黑 ...

这不是问题。通信过来的本来就是整个的数据包。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP