0

TL;DR:Rails 5.1、Ruby 2.4.0 正在序列化一个哈希,其中包括 Time 对象,并在时间的字符串表示周围加上引号。这些引号在 Rails 2.3、Ruby 1.8.7 中不存在,并且破坏了我的应用程序;我该如何摆脱它们?

背景和细节

我正在将应用程序从 Rails 2.3、Ruby 1.8.7 升级到 Rails 5.1、Ruby 2.4.0。我有一个ReportService类,它有一个report_params带有哈希的构造函数参数。创建这些对象后,此哈希以 YAML 格式序列化。

class ReportService < ApplicationRecord
  # irrelevant AR associations omitted
   serialize :report_params
   serialize :output_urls
end

用户提交包含他们想要运行的报告的详细信息的表单,包括使用 Time.parse() 解析的字符串,该字符串作为构造函数参数传递;所以代码(以程序形式去除不相关的细节,省略了很多无关的东西)看起来像

offset = customer.timezone.nil? ? '+0000' : customer.timezone.formatted_offset(:time => start_date)
params[:date_from] = Time.parse("#{start_date} #{params[:hour_from]}:{params[:min_from]} #{offset}").utc.strftime('%Y-%m-%d %H:%M:%S')
report_args = {...
                report_params: { ...
                                 date: params[:date_from]
                               }
               }
ReportService.create(report_args)

当我查看我的 MYSQL 数据库时,我发现我的 report_params 字段看起来像... date_from: '2017-12-27 00:00:00' .... 旧版本中的相应代码产生的结果看起来像... date_from: 2017-12-27 00:00:00 .... 这是一件坏事,因为该字段中的 YAML 正在被一个(旧版)Java 应用程序解析,该应用程序轮询数据库以检查新条目,并且引号似乎破坏了反序列化(抛出java.lang.Exception: BaseProperties.getdate());如果我手动编辑该字段以删除引号,该应用程序将按预期工作。如何防止添加这些引号?

4

1 回答 1

2

Rails5.1/Ruby2.4正确,因为2017-12-27 00:00:00它不是有效的 yaml 值。

好处是serialize接受两个参数,第二个是序列化程序类

所以,你需要做的就是:

class ReportService < ApplicationRecord
  # irrelevant AR associations omitted
   serialize :report_params, MyYaml
   serialize :output_urls, MyYaml
end

并实施MyYaml,委派一切,为/保存并date生产您需要的任何东西。timeYAML

以上对任何格式的序列化数据都有效,它完全与格式无关。例子

于 2018-01-02T17:27:25.213 回答