我有两个应用程序使用队列相互交谈,因为现在它们运行完全相同版本的ruby(1.8.7),所以我只是来回编组对象;只有标准库中的对象主要是哈希,字符串,时间和日期对象。
现在我正在转向Ruby 1.9.1,当时是一个应用程序,这意味着我将运行一个1.8.7的应用程序,另一个运行1.9.1的应用程序。通过运行我的测试,我知道Marshal在版本之间不可靠,我可以使用YAML,但速度要慢得多,JSON似乎更快,但它不直接处理日期/时间对象。
是否有一种可靠而快速的方法来跨不同版本序列化ruby对象?
答案 0 :(得分:0)
我没有尝试过ruby,但是你可以查看协议缓冲区吗?它设计为快速但可移植的二进制格式,它有一个ruby端口here。但是,您可能必须将生成的类型视为单独的DTO层(即,将现有数据映射到新类型,而不是序列化现有对象)。请注意,没有内置的日期时间支持,但您可以在时代等中使用刻度线。
答案 1 :(得分:0)
这里的关键是找到一个常见的数据类型,你知道它将在Ruby版本中表示相同。这里显而易见的选择是将数据存储在外部数据库中(数据库接口库将处理所有转换)或以结构化文本格式写出数据。如果没有大量数据可以使用(并且数据主要是标准类型),我通常只将其存储为文本;导出/导入需要更长的时间,但写入通常会更快。
答案 2 :(得分:0)
Protobufs很好,但是如果我记得的话,需要你预先定义你的数据结构。 Thrift类似于protobufs,但具有一些不错的代码生成功能。
Apple的二进制属性列表格式听起来与您的需求非常接近。它在行为上与JSON类似,但更紧凑,并支持一些额外的类型,包括日期时间和未编码的二进制文件。 github上有几个ruby实现。
您最好的选择可能是BERT。 BERT基于Erlang的二进制术语序列化格式。它非常紧凑,包括数据时间序列化,并以十几种语言实现,包括ruby。