Я изолировал проблему с Ruby on Rails, где модель с сериализованным столбцом неправильно загружает данные, которые были сохранены в ней.YAML Кодирование искаженной строки, проблемы сериализации модели
Что происходит, это хэш, и то, что выходит, это строка 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 есть струнное определение # 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, может посоветовать.
Спасибо за понимание. Я до сих пор не знаю, с кем связаться, чтобы решить эту проблему, но есть проект Github (http://github.com/indeyets/syck/), который выполняется из старого репозитория _why. Я столкнулся с этой проблемой при сериализации вывода HTML HAML в столбец ActiveRecord. HAML, по совпадению, форматирует HTML с той же структурой с двумя пространствами, что и YAML, и запускает этот регистр. – tadman
Считаете ли вы использование другой схемы сериализации, такой как маршал? Должно быть, это ямль? – bantic
Что мне нужно - это то, что позволяет исправить поведение сериализованных столбцов ActiveRecord. Если есть способ использовать Маршала, я все для этого, но я не видел никакой информации о том, как это сделать без серьезной атаки. – tadman