【发布时间】:2010-12-08 19:58:51
【问题描述】:
我已经隔离了 Ruby on Rails 的一个问题,其中带有序列化列的模型无法正确加载已保存到其中的数据。
输入的是哈希,输出的是由于格式问题而无法解析的 YAML 字符串。我希望序列化程序可以正确存储和检索您提供的任何内容,因此似乎出了点问题。
有问题的麻烦字符串格式如下:
message_text = <<END
X
X
END
yaml = message_text.to_yaml
puts yaml
# =>
# --- |
#
# X
# X
puts YAML.load(yaml)
# => ArgumentError: syntax error on line 3, col 0: ‘X’
换行符、缩进的第二行和不缩进的第三行的组合会导致解析器失败。省略空行或缩进似乎可以解决问题,但这似乎是序列化过程中的一个错误。由于它需要一组相当独特的情况,我敢打赌这是一些没有得到妥善处理的奇怪边缘情况。
Ruby 附带并由 Rails 使用的 YAML 模块看起来将大部分处理委派给 Syck,但确实为 Syck 提供了一些关于如何对其发送的数据进行编码的提示。
在 yaml/rubytypes.rb 中有 String#to_yaml 定义:
class String
def to_yaml( opts = {} )
YAML::quick_emit( is_complex_yaml? ? self : nil, opts ) do |out|
if is_binary_data?
out.scalar( "tag:yaml.org,2002:binary", [self].pack("m"), :literal )
elsif to_yaml_properties.empty?
out.scalar( taguri, self, self =~ /^:/ ? :quote2 : to_yaml_style )
else
out.map( taguri, to_yaml_style ) do |map|
map.add( 'str', "#{self}" )
to_yaml_properties.each do |m|
map.add( m, instance_variable_get( m ) )
end
end
end
end
end
end
那里似乎有一个检查以':'开头的字符串,并且在反序列化时可能会被混淆为符号,并且 :quote2 选项应该是在编码过程中引用它的指示。调整这个正则表达式来捕捉上述条件似乎对输出没有任何影响,所以我希望更熟悉 YAML 实现的人可以提出建议。
【问题讨论】:
标签: ruby-on-rails ruby yaml syck