本帖最后由 orzfly 于 2012-7-19 19:36 编辑
这东西我上次就跟你说了 N 次了……
String 会变成一个含有 :E 这个 instance_variable 且值为 true 的结构嘛。
有实例变量的 String 自然用 I 这个来储存 instance_variable 了。
目测你的 Marshal 处理是把 IC 连起来处理了。其实仔细看看 Ruby 的源代码或者 IronRuby 的实现就能知道 I 后面跟着一个按照 Marshal 格式的对象,然后接下来是实例变量数,然后一个 Symbol 然后一个 Object ……
至于 :E,恐怕是为了避免改变 Marshal 规范中而想出来的兼容之法吧。
:E 其实和字符串的编码有关。
您看下面的例子:
[ 1 ] pry( main) > Marshal .dump ( "orzFly" )
=> "\x 04\b I\" \v orzFly\x 06:\x 06ET"
[ 2 ] pry( main) > Marshal .dump ( "orzFly" .force_encoding ( "utf-8" ) )
=> "\x 04\b I\" \v orzFly\x 06:\x 06ET"
[ 3 ] pry( main) > Marshal .dump ( "orzFly" .force_encoding ( "gb2312" ) )
=> "\x 04\b I\" \v orzFly\x 06:\r encoding\" \v GB2312"
[ 4 ] pry( main) > Marshal .dump ( "orzFly" .force_encoding ( "gbk" ) )
=> "\x 04\b I\" \v orzFly\x 06:\r encoding\" \b GBK"
[ 5 ] pry( main) > Marshal .dump ( "orzFly" .force_encoding ( "ascii" ) )
=> "\x 04\b I\" \v orzFly\x 06:\x 06EF"
[ 6 ] pry( main) > Marshal .dump ( "orzFly" .force_encoding ( "utf-16le" ) )
=> "\x 04\b I\" \v orzFly\x 06:\r encoding\" \r UTF-16LE"
[ 7 ] pry( main) > Marshal .dump ( "orzFly" .force_encoding ( "utf-16be" ) )
=> "\x 04\b I\" \v orzFly\x 06:\r encoding\" \r UTF-16BE"
[ 1 ] pry( main) > Marshal .dump ( "orzFly" )
=> "\x 04\b I\" \v orzFly\x 06:\x 06ET"
[ 2 ] pry( main) > Marshal .dump ( "orzFly" .force_encoding ( "utf-8" ) )
=> "\x 04\b I\" \v orzFly\x 06:\x 06ET"
[ 3 ] pry( main) > Marshal .dump ( "orzFly" .force_encoding ( "gb2312" ) )
=> "\x 04\b I\" \v orzFly\x 06:\r encoding\" \v GB2312"
[ 4 ] pry( main) > Marshal .dump ( "orzFly" .force_encoding ( "gbk" ) )
=> "\x 04\b I\" \v orzFly\x 06:\r encoding\" \b GBK"
[ 5 ] pry( main) > Marshal .dump ( "orzFly" .force_encoding ( "ascii" ) )
=> "\x 04\b I\" \v orzFly\x 06:\x 06EF"
[ 6 ] pry( main) > Marshal .dump ( "orzFly" .force_encoding ( "utf-16le" ) )
=> "\x 04\b I\" \v orzFly\x 06:\r encoding\" \r UTF-16LE"
[ 7 ] pry( main) > Marshal .dump ( "orzFly" .force_encoding ( "utf-16be" ) )
=> "\x 04\b I\" \v orzFly\x 06:\r encoding\" \r UTF-16BE"