5

我目前在我的 Java 项目中使用 JSON(通过 gzip 压缩),其中我需要在磁盘上存储大量对象(数亿)。我每行有一个 JSON 对象,并且不允许 JSON 对象中的换行符。通过这种方式,我可以逐行从磁盘流式传输数据,而无需一次读取整个文件。

事实证明,解析 JSON 代码(使用http://www.json.org/java/)比从磁盘上提取原始数据或解压缩它(我在运行中进行)的开销更大。

理想情况下,我想要的是一种强类型的序列化格式,我可以在其中指定“此对象字段是字符串列表”(例如),并且因为系统知道会发生什么,它可以快速反序列化它。我也可以通过给别人它的“类型”来指定格式。

它还需要是跨平台的。我使用 Java,但与使用 PHP、Python 和其他语言的人一起工作。

所以,回顾一下,它应该是:

  • 强类型
  • 可流式传输(即逐位读取文件,而无需一次将其全部加载到 RAM 中)
  • 跨平台(包括Java和PHP)
  • 快速地
  • 免费(如演讲)

任何指针?

4

3 回答 3

8

你看过谷歌协议缓冲区吗?:

http://code.google.com/apis/protocolbuffers/

它们是跨平台的(C++、Java、Python),还带有 PHP 的第三方绑定。它速度快、相当紧凑且类型强大。

这里还有各种格式之间的有用比较:

http://code.google.com/p/thrift-protobuf-compare/wiki/Benchmarking

您可能还想考虑 Thrift 或此处提到的其他之一。

于 2009-07-28T02:23:26.033 回答
3

我用Jackson解析 JSON 的结果非常好

杰克逊是:

  • 流式传输(读、写)
  • FAST(比任何其他 Java json 解析器和数据绑定器都快)
  • 功能强大(通用 JDK 类以及任何 Java bean 类、Collection、Map 或 Enum 的完整数据绑定)
  • 零依赖(不依赖JDK以外的其他包)
  • 开源(LGPL 或 AL)
  • 完全符合

用 Java 编写的 JSON 处理器(JSON 解析器 + JSON 生成器)。除了基本的 JSON 读/写(解析、生成)之外,它还提供了完整的基于节点的树模型,以及完整的 OJM(Object/Json Mapper)数据绑定功能。

与许多其他序列化选项相比,它的性能非常好。

于 2009-07-28T07:15:56.133 回答
2

你可以看看 YAML- http://www.yaml.org/

它是 JSON 的超集,因此您会熟悉数据文件结构。它支持一些额外的数据类型以及使用将一个数据结构的一部分包含到另一个数据结构中的引用的能力。

我不知道它是否会“足够快”-但 libyaml 解析器(用 C 编写)似乎非常敏捷。

于 2009-07-28T02:36:15.140 回答