我上了一个新的软件,最终会需要一些强大的,可扩展的文件IO开始工作。 有很多的格式在那里。 XML,JSON,INI等。然而,总有一些加分和劣势,所以我想我会问一些社区的意见。
这里有一些粗略的要求:
- 格式为“标准” ......我不想推倒重来,如果我没有。 它没有成为一个正式的IEEE标准的事,但你可以谷歌并获得新用户的一些信息,可能有一些支持工具(编辑)超越六。 (虽然软件的用户通常是精通电脑和乐于使用vi。)
- 轻松地与C ++集成。 我不希望有沿100MB库,三个不同的编译器拉让它运行起来。
- 支持表格输入(2d中,n维)
- 支持POD类型
- 能否扩大,因为需要更多的投入,结合很好的变量等。
- 解析速度是不是非常重要
- 理想的情况下,容易写(反映),因为它是阅读
- 非常适用于Windows和Linux
- 支持合成(一个文件中引用另一个文件阅读,等等。)
- 人类可读
在一个完美的世界,我会用一个只有标题 - 库或一些干净的STL实现,但我很好利用升压或一些小的外部库是否正常工作。
那么,什么是你对各种格式的想法? 缺点? 好处?
编辑
选项的考虑? 还有什么补充的吗?
- XML
- YAML
- SQLite的
- 谷歌协议缓冲
- 升压序列化
- INI
- JSON
有一个满足所有标准的一个极好的格式:
SQLite的!
请阅读文章有关使用SQLite作为应用程序的文件格式。 另外,请观看谷歌技术讲座由D·理查德·希普(SQLite的作者)关于这个题目。
现在,让我们看看如何SQLite的满足您的要求:
格式为“标准”
SQLite的已经成为大多数移动环境的首选格式,并为许多桌面应用程序(火狐,雷鸟,谷歌Chrome,Adobe Reader中,你的名字)。
容易使用C ++集成
SQLite的具有标准C接口 ,这是只有一个源文件和一个头文件。 有C ++包装过 。
支持表格输入(2d中,n维)
SQLite的表为表,你可能想象。 为了表示说3维数据,创建表的列x,y,z,value
和存储数据为一组这样的列:
x1,y1,z1,value1
x2,y2,z2,value2
...
支持POD类型
我想通过POD你的意思是普通老式的数据,或BLOB。 SQLite的,您可以存储BLOB字段是。
能否扩大,因为需要更多的投入,以及绑定变量
这是它真正的亮点。
解析速度是不是非常重要
但SQLite的速度是一流的。 事实上,解析是基本上透明的。
理想的情况下,容易写(反映),因为它是阅读
只需使用INSERT
编写和SELECT
阅读-这可能是更容易?
非常适用于Windows和Linux
没错,和所有其他平台以及。
支持合成(一个文件中引用另一个文件阅读)
您可以将一个数据库到另一个。
人类可读
不是二进制,但也有许多优秀的SQLite的浏览器/编辑那里。 我喜欢SQLite的专家个人在Windows和sqliteman在Linux上。 还有SQLite的编辑器插件的Firefox 。
还有其他的优点是SQLite的为您提供免费的:
数据是可转位 ,这使得它非常快速的搜索。 你不能做到这一点使用XML,JSON或任何其他纯文本格式。
数据可以部分地被编辑,即使当数据量是非常大的。 你不必重写几GB只需编辑一个值。
SQLite是完全事务性的 :它保证你的数据在任何时候都保持一致。 即使你的应用程序(或整个计算机)崩溃,您的数据将自动恢复到上次于未来第一次尝试已知的一致状态,以连接到数据库。
SQLite的存储数据逐字 :你不必担心你的数据(包括嵌入在你的字符串零个字节)逃逸垃圾字符-简单地一直使用准备好的语句 ,这一切需要,使之透明。 与文本数据格式,XML特别处理时,这是大和恼人的问题。
SQLite的存储以Unicode所有字符串: UTF-8
默认)或UTF-16
。 换句话说,你不必担心文本编码或为您的数据格式的国际支持。
SQLite的允许你来处理小块(在事实上鳞次栉比)的数据,因此它运作良好,在内存不足的情况 。 这可以是任何基于文本格式的问题,因为他们往往需要将所有的文本加载到内存中解析它。 当然,也有一些有效的基于流的XML解析器在那里,但一般比SQLite的任何XML解析器会相当内存贪婪。
工作过相当多的与XML和JSON,这是我的两个可伸长的序列化格式,而主观意见:
- 格式为“标准”:有两个
- 轻松地与C ++集成:有两种。 在每一种情况下,你可能会以某种库来处理它的风。 在Linux中,libxml2的是一个标准的,并且libxml的++是C为它++包装; 你应该能够得到这两个从你的发行版的软件包管理器。 这将需要一些小的努力让那些在Windows上工作。 有似乎是在加速对JSON的一些支持,但我没有用它; 我一直处理使用JSON库。 说真的,库路径是不是要么非常繁重。
- 支持表格输入(2d中,n维):是用于两者
- 支持POD类型:有两种
- 能否扩大,因为需要更多的投入:是两个 - 这是一个很大的优势,他们两个。
- 以及绑定变量:如果你的意思是文件本身内部的一些办法说“ 这个数据都必须被自动反序列化到这个变量在我的节目”,那么没有两个。
- 至于易写(反映),因为它是阅读:取决于你使用的库,但我的经验是两个。 (实际上,你可以做到用printf()写JSON的可容忍的工作。)
- 非常适用于Windows和Linux:是两个,并且同上Mac OS X中对这一问题。
- 支持一个文件中引用另一个文件阅读:如果你的意思是类似于一个C的#include,那么XML具有一定的能力做到这一点(例如,文档实体),而JSON没有。
- 人类可读的:两个通常写入UTF-8,并允许换行和缩进,并且因此可以是人可读的。 不过,我刚刚一直在与这一切都在一行479 KB的XML文件,所以我不得不通过prettyprinter来运行它,以它的意义。 JSON也可以相当难懂,但在我的经验往往比格式化XML更好。
当开始新的项目,我一般喜欢JSON; 这是更紧凑,更可读的。 我可能会选择在JSON XML的主要理由是,如果我是担心接受严重,形成文件,因为XML支持自动文档格式验证,而你必须写使用JSON自己的验证码。
看看谷歌的缓冲区 。 这种处理您的大多数要求。
从他们的文档 ,高级别步骤如下:
定义在.proto文件消息格式。
使用的协议缓冲编译器。
使用C ++协议缓冲API来写入和读出的消息。
对于我而言,我觉得要走的路是XML。
- 格式是一个标准的,但允许进行修改和灵活性的模式来改变作为程序要求的变化。
- 有几个库选项。 一些较大(的Xerces-C)一些较小(ezxml),但也有很多选择,所以我们不会被锁定在单一供应商或非常具体的解决方案。
- 它可以支持表格输入(2d中,n维)。 这就需要对“我们”到底有多的解析工作,并有可能对XML最薄弱的环节。
- 支持POD类型:绝对的。
- 能否扩大,因为需要更多的投入,结合很好的变量等通过模式修改和解析器修改。
- 解析速度是不是非常重要的,因此处理文本文件或文件不是问题。
- XML可以通过编程写入一样容易阅读。
- 非常适用于Windows和Linux或支持C和文本文件的任何其他操作系统。
- 支持合成(一个文件中引用另一个文件阅读,等等。)
- 人类可读的有很多文本编辑器(卓异,VI等),支持语法高亮开箱。 许多Web浏览器显示的数据良好。
感谢所有伟大的反馈! 我想,如果我们想要一个纯粹的二进制的解决方案,协议缓冲器或升压::序列化是有可能,我们会走的路。