YAMLエンコードの不正な文字列モデルを直列化の問題
-
05-07-2019 - |
質問
私は孤立した問題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’
の組み合わせに改行,インデント第二に、非インデント第三線の原因となパーサを確認してください。省略には、空行のインデントが表示される治療の問題であり、このはなされているとは聞いているバグを直列化です。要するためのユニークな設定の状況下、私は思ベットはこれは不思議な縁に合う機会を設けていきたいと思い適切に取り扱う。
のYAMLモジュールとRubyを使うことによりレールを見る委譲の大部分の加工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実現できるアドバイスを記します。
解決
組織っぽのように見えるバグをsyck図書館があります。I確認し、これまでに、いくつかのPHP syckのバインディング(v0.9.3): http://pecl.php.net/package/syck 同一のバグが存在することを示すのではバグの図書館に対して、ruby yaml図書館は主にruby-syckのバインディング:
// phptestsyck.php
<?php
$message_text = "
X
X
";
syck_load(syck_dump($message_text));
?>
このcliを起動と同じSyckException:
$ php phptestsyck.php
PHP Fatal error: Uncaught exception 'SyckException' with message 'syntax error on line 5, col 0: 'X'' in /.../phptestsyck.php:8
Stack trace:
#0 /.../phptestsyck.php(8): syck_load('--- %YAML:1.0 >...')
#1 {main}
thrown in /.../phptestsyck.php on line 8
そこで、例えば、皆さんができるように修正Syckそのものです。この図書館がなされた以降に更新v0.55月2005年http://rubyforge.org/projects/syck/)あります。
交互にあり、純粋ruby yamlパーサーと呼ばれRbYAML(http://rbyaml.rubyforge.org/ るの由来はJRubyに反映されないこのバグ:
>> require 'rbyaml'
=> true
>> message_text = <<END
X
X
END
=> "\n X\nX\n"
>> yaml = RbYAML.dump(message_text)
=> "--- "\\n X\\nX\\n"\n"
>> RbYAML.load(yaml)
=> "\n X\nX\n"
>>
最後に、まと他の直列化形式。RubyのMarshal図書館のないこのバグはやはりYaml参照 http://significantbits.wordpress.com/2008/01/29/yaml-vs-marshal-performance/):
>> message_text = <<END
X
X
END
=> "\n X\nX\n"
>> marshal = Marshal.dump(message_text)
=> "\004\b"\f\n X\nX\n"
>> Marshal.load(marshal)
=> "\n X\nX\n"
他のヒント
教えていただけると嬉しいのは容易で serialize
ActiveRecord::ベースの方法ようなハードな使用直列化さい。例えば、serializeくつかのフィールドと呼ばれるperson_data':
class Person < ActiveRecord::Base
def person_data
self[:person_data] ? Marshal.load(self[:person_data]) : nil
end
def person_data=(x)
self[:person_data] = Marshal.dump(x)
end
end
## User Person#person_data as normal and it is transparently marshalled
p = Person.find 1
p.person_data = {:color => "blue", :food => "vegetarian"}
(この rubyフォーラムのスレッド より)