Project1

标题: Ruby 1.9.2 下String的Marshal问题 [打印本页]

作者: IamI    时间: 2012-7-19 13:28
标题: Ruby 1.9.2 下String的Marshal问题
本帖最后由 IamI 于 2012-7-19 15:01 编辑

RUBY 代码复制
  1. class A < Array
  2.   def initialize
  3.     @b = :b
  4.   end
  5. end
  6. a = A.new
  7. a.push(999)
  8. a.push("999")
  9. save_data(a,"x.data")
  10. exit


=>
IC:A[i?I"999:ET:@b:b

<=>
04 08 49 43 3A 06 41 5B 07 69 02 E7 03 49 22 08
39 39 39 06 3A 06 45 54
06 3A 07 40 62 3A 06 62
<=>
. . I C : . A [ . i . ? I " .
9 9 9 . : . E T
. : . @ b : . b
红字部分
I 后接着一个字符串起始号,这不科学!
此外
读取知
argument 数量为1:
T = true

这个T是什么东西?还没“@”

@第七水螰@OrzFly
相关传送门
作者: 七夕小雨    时间: 2012-7-19 18:52
http://www.kuqin.com/rubycndocument/man/Marshal_format.html

别激动的啊= =

说明文档很清楚了
nil,true,false
分别是'0', 'T', 'F'
作者: orzfly    时间: 2012-7-19 19:31
本帖最后由 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 其实和字符串的编码有关。
您看下面的例子:
RUBY 代码复制
  1. [1] pry(main)> Marshal.dump("orzFly")
  2. => "\x04\bI\"\vorzFly\x06:\x06ET"
  3. [2] pry(main)> Marshal.dump("orzFly".force_encoding("utf-8"))
  4. => "\x04\bI\"\vorzFly\x06:\x06ET"
  5. [3] pry(main)> Marshal.dump("orzFly".force_encoding("gb2312"))
  6. => "\x04\bI\"\vorzFly\x06:\rencoding\"\vGB2312"
  7. [4] pry(main)> Marshal.dump("orzFly".force_encoding("gbk"))
  8. => "\x04\bI\"\vorzFly\x06:\rencoding\"\bGBK"
  9. [5] pry(main)> Marshal.dump("orzFly".force_encoding("ascii"))
  10. => "\x04\bI\"\vorzFly\x06:\x06EF"
  11. [6] pry(main)> Marshal.dump("orzFly".force_encoding("utf-16le"))
  12. => "\x04\bI\"\vorzFly\x06:\rencoding\"\rUTF-16LE"
  13. [7] pry(main)> Marshal.dump("orzFly".force_encoding("utf-16be"))
  14. => "\x04\bI\"\vorzFly\x06:\rencoding\"\rUTF-16BE"





欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1