本帖最后由 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") => "\x04\bI\"\vorzFly\x06:\x06ET" [2] pry(main)> Marshal.dump("orzFly".force_encoding("utf-8")) => "\x04\bI\"\vorzFly\x06:\x06ET" [3] pry(main)> Marshal.dump("orzFly".force_encoding("gb2312")) => "\x04\bI\"\vorzFly\x06:\rencoding\"\vGB2312" [4] pry(main)> Marshal.dump("orzFly".force_encoding("gbk")) => "\x04\bI\"\vorzFly\x06:\rencoding\"\bGBK" [5] pry(main)> Marshal.dump("orzFly".force_encoding("ascii")) => "\x04\bI\"\vorzFly\x06:\x06EF" [6] pry(main)> Marshal.dump("orzFly".force_encoding("utf-16le")) => "\x04\bI\"\vorzFly\x06:\rencoding\"\rUTF-16LE" [7] pry(main)> Marshal.dump("orzFly".force_encoding("utf-16be")) => "\x04\bI\"\vorzFly\x06:\rencoding\"\rUTF-16BE"
[1] pry(main)> Marshal.dump("orzFly")
=> "\x04\bI\"\vorzFly\x06:\x06ET"
[2] pry(main)> Marshal.dump("orzFly".force_encoding("utf-8"))
=> "\x04\bI\"\vorzFly\x06:\x06ET"
[3] pry(main)> Marshal.dump("orzFly".force_encoding("gb2312"))
=> "\x04\bI\"\vorzFly\x06:\rencoding\"\vGB2312"
[4] pry(main)> Marshal.dump("orzFly".force_encoding("gbk"))
=> "\x04\bI\"\vorzFly\x06:\rencoding\"\bGBK"
[5] pry(main)> Marshal.dump("orzFly".force_encoding("ascii"))
=> "\x04\bI\"\vorzFly\x06:\x06EF"
[6] pry(main)> Marshal.dump("orzFly".force_encoding("utf-16le"))
=> "\x04\bI\"\vorzFly\x06:\rencoding\"\rUTF-16LE"
[7] pry(main)> Marshal.dump("orzFly".force_encoding("utf-16be"))
=> "\x04\bI\"\vorzFly\x06:\rencoding\"\rUTF-16BE"
|