查看: 2659|回复: 2

[已经解决] Ruby 1.9.2 下String的Marshal问题

[复制链接]

孤独守望

梦石
0
星屑
3144
在线时间
1535 小时
注册时间
2006-10-16
回帖
4223

开拓者贵宾

发表于 2012-7-19 13:28:58 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
本帖最后由 IamI 于 2012-7-19 15:01 编辑

[pre lang="ruby" line="1"]class A < Array
  def initialize
    @b = :b
  end
end
a = A.new
a.push(999)
a.push("999")
save_data(a,"x.data")
exit[/pre]

=>
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
相关传送门

点评

UI> 紫苏老板换账号了。  发表于 2012-7-19 13:30
菩提本非树,明镜本非台。回头自望路漫漫。不求姻缘,但求再见。
本来无一物,何处惹尘埃。风打浪吹雨不来。荒庭遍野,扶摇难接。
不知道多久更新一次的博客

昨日的黄昏

梦石
0
星屑
1005
在线时间
937 小时
注册时间
2006-11-5
回帖
4020

第2届短篇游戏比赛季军第3届短篇游戏大赛小游戏及其他组季军

发表于 2012-7-19 18:52:42 | 显示全部楼层
http://www.kuqin.com/rubycndocument/man/Marshal_format.html

别激动的啊= =

说明文档很清楚了
nil,true,false
分别是'0', 'T', 'F'
[url=http://weibo.com/2238291690?s=6uyXnP]
回复

使用道具 举报

Fuzzy Ginkgo

梦石
0
星屑
61105
在线时间
1933 小时
注册时间
2010-6-26
回帖
1535

烫烫烫开拓者

发表于 2012-7-19 19:31:39 | 显示全部楼层
本帖最后由 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 其实和字符串的编码有关。
您看下面的例子:
[pre lang="ruby" line="1"][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"
[/pre]

评分

参与人数 1星屑 +600 收起 理由
IamI + 600 谢谢。

查看全部评分

我的言论只代表我个人的观点,不代表雇主及/或任何第三方的立场。
Opinions expressed are solely my own and do not express the views or opinions of my employer and/or any third parties.
捐赠 | GitHub
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部