【问题标题】:Is there a fast and reliable way of serializing objects across different versions of Ruby?是否有一种快速可靠的方法可以跨不同版本的 Ruby 序列化对象?
【发布时间】:2010-02-18 20:37:08
【问题描述】:

我有两个应用程序使用队列相互通信,到目前为止它们运行完全相同版本的 ruby​​ (1.8.7),所以我只是来回编组对象;只有标准库中的对象主要是哈希、字符串、时间和日期对象。

现在我正在迁移到 Ruby 1.9.1,当时只有一个应用程序,这意味着我将在一段时间内运行一个 1.8.7 的应用程序和另一个 1.9.1 的应用程序。通过运行我的测试,我知道 Marshal 跨版本不可靠,我可以使用 YAML,但它要慢得多,JSON 似乎更快,但它不直接处理日期/时间对象。

是否有可靠且快速的方法来跨不同版本序列化 ruby​​ 对象?

【问题讨论】:

    标签: ruby serialization ruby-1.8


    【解决方案1】:

    我还没有在 ruby​​ 上尝试过,但是你可以看看协议缓冲区吗?设计为一种快速但可移植的二进制格式,它有一个 ruby​​ 端口here。不过,您可能必须将生成的类型视为单独的 DTO 层(即将现有数据映射到新类型,而不是序列化现有对象)。请注意,没有内置的日期时间支持,但您可以只在一个纪元中使用刻度等。

    【讨论】:

    • 谢谢,现在检查一下,我喜欢 Marshal 的透明性,不必自己处理数据类型,但我想在不同版本之间没有办法解决。
    【解决方案2】:

    这里的关键是找到一种您知道在 Ruby 版本中表示相同的通用数据类型。这里明显的选择是将数据存储在外部数据库中(数据库接口库将处理所有转换)或以结构化文本格式写出数据。如果没有大量数据可供使用(并且数据大多是标准类型),我通常将其存储为文本;导出/导入需要更长的时间,但通常写起来更快。

    【讨论】:

    • 嗯,我正在向队列服务器来回发送非常小的消息,避免写入磁盘非常重要,就我而言,如果我丢失了几条消息并不重要可以快速处理其中的大部分。理想情况下,可以识别日期时间的基于 JSON 的实现将是理想的。
    • 啊,那样的话写一个文件确实太多了。缺少日期时间支持是阻止您使用 JSON 的唯一想法吗?如果是这样,您应该能够相当快地将 Ruby DateTime 对象转换为替代表示(反之亦然)。我已经使用字符串(DateTime.to_sDateTime.strptime)和整数(Time.to_iTime.at)存储了 Ruby 日期/时间对象,当我不得不将它们集中到中间时。
    【解决方案3】:

    Protobuf 很好,但如果我记得的话,需要您预先定义数据结构。 Thrift 类似于 protobufs,但具有一些不错的代码生成功能。

    Apple 的二进制属性列表格式听起来很接近您的需要。它在行为上类似于 JSON,但更紧凑并支持一些额外的类型,包括日期时间和未编码的二进制文件。 github 上有几个 ruby​​ 实现。

    您最好的选择可能是BERT。 BERT 基于 Erlang 的二进制术语序列化格式。它很紧凑,包括数据时间序列化,并以十几种语言实现,包括 ruby​​。

    【讨论】:

      猜你喜欢
      • 2012-03-03
      • 2015-08-15
      • 2011-02-12
      • 1970-01-01
      • 1970-01-01
      • 2012-08-07
      • 2013-05-15
      • 1970-01-01
      • 2018-06-09
      相关资源
      最近更新 更多