二进制解析器还是序列化?

8
我想为游戏存储不同对象的图形,它们的类可能相关,也可能不相关,它们可能包含简单结构的向量。
  • 我希望解析操作快速进行,数据可能非常大。
  • 添加新内容不应该很困难,并且不应该破坏向后兼容性。
  • 较小的文件大小有一定重要性。
  • 可读性很重要。
通过序列化,我指的是使对象自行序列化,这很有效,但我需要为不同的对象编写不同的序列化方法。
通过二进制解析/组合,我指的是创建一个新的解析器/组合器树,用于保存和读取这些对象的数据,并将其传递给我的对象来推送/拉取它们的数据。
我也可以使用JSON,但对于读取来说可能相当慢,并且当涉及到相当大的矩阵和数字集时,在大小方面并不是非常有效。

我最终编写了一个简单的二进制解析器,我构建了结构树并推送简单数据或其他数据集,如果需要,它还可以生成JSON文本,我需要定义toJson方法,但至少我的结构是明确定义的,经济实用且易于解析,无需使用解析器库。 - M. Utku ALTINKAYA
3个回答

3
逐点说明:
  • 快速解析:二进制(由于您不一定需要“解析”,因此可以直接反序列化)
  • 添加新内容:文本
  • 更小:文本(即使gzip压缩的文本比二进制大,它也不会大多少)。
  • 可读性:文本

因此,对于除图像(和其他“自然”二进制数据)之外的所有内容,我都会选择文本。然后,将所有内容存储在一个大的zip文件中(我可以想到几个游戏会这样做或类似的方法)。

好的阅读材料:成为文本的重要性纯文本的力量


1

可以查看谷歌的协议缓冲区或者Apache的Thrift。虽然它们被标榜为一种轻松编写线路协议的方式,但实际上它们是一种对象序列化机制,可以在十几种语言中创建绑定,具有高效的二进制表示、易于版本控制、快速的性能和良好的支持。


看起来很不错,我会去试试看。 - M. Utku ALTINKAYA
不建议发送超过1MB的消息,单个网格数据很容易超过这个限制,潜水数据需要不同的树状结构来处理消息,这可能会使事情变得复杂。 - M. Utku ALTINKAYA

0
我们正在使用Boost.Serialization,不知道它在与samkass提供的工具相比时表现如何。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接