Я выделил проблему с Ruby on Rails, когда модель с сериализованным столбцом неправильно загружает данные, которые были сохранены в ней.
В результате получается Hash, а в результате получается строка 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’
Сочетание новой строки, отступа второй строки и не отступа третьей строки приводит к сбою синтаксического анализатора. Пропуск пустой строки или отступа, по-видимому, исправляет проблему, но, похоже, это ошибка в процессе сериализации. Поскольку это требует довольно уникального набора обстоятельств, я готов поспорить, что это какой-то странный крайний случай, который не обрабатывается должным образом.
Модуль YAML, который поставляется с Ruby и используется Rails, по-видимому, делегирует большую часть обработки 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, может посоветовать.