Ruby Ruby marshal dump 的东西自己也不认得

cichol · 2015年10月11日 · 最后由 dothide 回复于 2015年10月11日 · 2782 次阅读
#encoding: utf-8

obj = "keywords"
File.open('test', 'wb'){|f| f.write Marshal.dump(obj)}
Marshal.load(File.open('test', &:read))

ruby 1.9 运行即出错,问题出在 keywords 这个特定的字符组合

感觉只可以做些自定义的转码来解决。。有没有不那么麻烦的方法啊。。。

好吧,我解决了

def process obj
  case obj
  when String
    obj.chars.map{|x| x.ord}.join('.')
  when Array
    obj.map{|x| process x}
  when Hash
    new_hash = {}
    obj.each do |k,v|
      new_hash[process k] = process v
    end
    new_hash
  else obj
  end
end

def recover obj
  case obj
  when String
    obj.split('.').map{|x| x.to_i.chr(Encoding.find('utf-8'))}.join
  when Array
    obj.map{|x| recover x}
  when Hash
    new_hash = {}
    obj.each do |k,v|
      new_hash[recover k] = recover v
    end
    new_hash
  else obj
  end
end

dump 之前 process load 之后 recover

本质是把字符串改成数字的字符串,虽然应该也会有隐患,但是目前看来还没有问题

这 BUG 真是太坑爹,5 个小时就这么没了

win OS 里 File.open 要用 'rb' 模式吧

#2 楼 @windwiny 看来确实是,以前 binary 和普通读混用没注意这点。。 啊,兜了好大的圈子

测试一下

需要 登录 后方可回复, 如果你还没有账号请 注册新账号