目前位置: VCer资源中心 >>> VCer开源 >>> 可重用类

[本帖已阅读3485次 分值120 回复4次] 张贴资源 发回信箱 控制面板

白乔原创:二进制XML存储方案BinXML

提供者:bluejoe 张贴时间:2007-02-28 12:51:33.0 出处:vcer.net 作者:白乔

白乔原创:二进制XML存储方案BinXML(2007-02-28 12:51:33.0)


白乔


 
级别: VCer师长
头衔: VCer创始人

经验: 21107
作品: 514
分会: 华北分会
注册: 2003-12-01 09:20:32.0
登录: 2009-01-02 17:21:44.0
工程源码[45,379字节] 下载526
软件下载[35,304字节] 下载272

实现方法

BinXML是我个人杜撰出来的名字,不知道是否合适,也不知道是否已存在类似的解决方案。在vcer.net上我将前一段时间的这个BinXML方案贡献出来,希望能够与广大vcer分享。

当时问题的背景是这样的,项目需要确定存储方案,这种方案需要满足如下要求:

  • 生成的单机板exe尽可能的不依赖于其它软件,如:数据库管理系统;
  • 存储的数据最好能够方便的拷贝,以满足项目的上报、汇总的功能;
  • 存储的格式以后可能还会变,变化不频繁,但是最好能支持这种变化;
  • 只需要数据的持久化与反持久化的功能,不需要查询统计等复杂功能;
  • 存储的数据中可能包括一个或者多个的文件附件,如:word文档;
  • 存储的数据可能被不同的平台使用,如:windows或者linux;
  • 作为web项目的一部分,除了提供VC的接口之外,存储的数据格式需要提供java的接口;

我首先考虑到了MsAccess格式,文件型数据库,方便拷贝,而且表的设计很柔性化。在windows环境下,MsAccess似乎可以不需要再安装额外的驱动,但是在linux环境下,如何被java调用是个问题(当然,这个问题也是可以解决的,但是很别扭)。其次,使用RDB还有一个问题:数据的层次表达与多值问题,将树型数据扁平化存储的方案是有的,但是,将几层简单的节点拆分成N个表格,岂不是杀鸡用牛刀?

其次的考虑当然是XML,然而XML是基于可读文本的,如何解决二进制数据问题?当然可以通过编码的途径来解决,但是这样使用XML是不是太牵强了?而且,XML有个缺陷,数据都是文本型的。要使用数值型、布尔型、日期型的数据,需要做进一步的解析。

那么就使用自定义的数据文件格式?传统情况下,我们会用一个或者若干个struct将数据打包,一下子塞进文件。但是现在用户说了:我们现在定义的数据结构可能会变:) 看来,我们的存储方案还必须要足够的柔性化。

想到最后,我决定还是借鉴XML的树型标签形式,来实现一种二进制的存储结构,即BinXML:)

关于src包

对于BinXML-src里面的例子,数据的结构类似于:

BinXML-src.zip包括两部分,一部分是vc的工程,一部分是java的工程,在Visual C++6.0和eclipse+JDK1.4中都已编译、运行通过。大家可以运行BinXML-bin.zip里面的exe程序,测试一下BinXML文件的加载和保存功能。

对象模型

BinXML的对象模型主要包括:文档(document)和节点(node)。每个文档包含一个根节点(root),根节点下面包含一个或者多个子节点,如此类推。

文档包含一个文件头,其中包含了一些标识串、操作系统版本、文件大小、文档创建时间等信息。

每个节点也包含一个节点头,表明该节点的名称以及大小。一般来说,用户不会直接接触到文件头和节点头这些信息。

如下为VC里的类声明:

在java里,定义了binxml.io包,其中的类、接口定义与以上相似。

你很容易想到,使用BinXML,可以很方便地完成CTreeCtrl的持久化。

如何使用?

如下是VC中加载BinXML的代码片断:

对应的,写入BinXML的代码片断:

是不是很简单?在java里面,BinXML的一个测试用例:

TODO

希望BinXML能给你带来一定的帮助和启发,更多的是希望能带来启发:)希望有兴趣的哥们继续完善BinXML,别忘了在你的大名之前保留我的版权信息:

BinXML需要完善的地方表现在:

  • 暂时只实现了string/long/byte[],还没有提供其它类型的解析与转换;
  • XML标签不支持属性,只支持子元素:)
  • 是不是可以提供一个oxm模型,完成BinXML与Object之间的直接映射,现在这个映射工作还是人工代码实现的,譬如:GetString/GetLong,等等。应该可以完善一个映射机制,自动根据定义好的类型进行转换;

注:转载文章需注明来源:VCer.net 文章地址:http://vcer.net/1172638293203.html

  如果你觉得VCer.net不错,而且你愿意为VCer.net捐赠一元钱,那么点击后面的捐赠按钮吧:) vcer.net捐赠

1082687209616[385,308字节]

得意,我用他的代码;

自豪,他用我的代码!

[回复该贴] [加入个人书签]
[投票结果]

A: 评分 10 100% (2 票)
B: 评分 5 0% (0 票)
C: 评分 0 0% (0 票)
D: 评分 -5 0% (0 票)
E: 评分 -10 0% (0 票)

 


re:白乔原创:二进制XML存储方案BinXML

very good!!1b02514q108626_bcb62e[40*40象素]

我现在想做一个XML的数据库,存储文件格式总是确定不下来,看了您的程序大有启发。如果我成功,我将共享我的数据库。

wtn66666 于 2008-08-19 17:23:05.0 编辑 [回复该贴]

re:re:白乔原创:二进制XML存储方案BinXML

学习了^^

microfenal 于 2008-08-27 09:32:42.0 编辑 [回复该贴]

re:re:白乔原创:二进制XML存储方案BinXML

祝你成功!呵呵……

bluejoe 于 2008-08-20 09:20:33.0 编辑 [回复该贴]

re:白乔原创:二进制XML存储方案BinXML

...Thanks for sharing!

depv 于 2007-07-06 18:12:18.0 编辑 [回复该贴]