混淆与红宝石`Marshal`概念

时间:2013-04-07 11:18:25

标签: ruby marshalling

Marshal#dump说:

  

序列化obj和所有后代对象。如果指定了IO,则会将序列化数据写入其中,否则数据将作为String返回。 如果指定了限制,则子对象的遍历将限制为该深度 。如果限制为负,则不会执行深度检查。

现在我的问题是:

  
      
  • 什么是深度?

  •   
  • 你能举一个反对粗线的例子吗?

  •   
  • 如果定义了marshal_dump,为什么_dump优先于{{1}}?

  •   

2 个答案:

答案 0 :(得分:2)

  
      
  • 什么是深度?
  •   
  • 你能举一个反对粗线的例子吗?
  •   

当编组对象时,它可以引用另一个对象,该对象可以引用另一个对象。深度级别:[1, 2, {"12" => [:foo]}]为4:

  • 等级1:[1, 2, {"12" => [:foo]}]
  • 第2级:12{"12" => [:foo]}
  • 第3级:"12"[:foo]
  • 等级4::foo

因此,您可以限制Marshal#dump将以递归方式查找的级别数:

Marshal.dump([1, 2, {"12" => [:foo]}], 4)
=> "\x04\b[\bi\x06i\a{\x06I\"\a12\x06:\x06ET[\x06:\bfoo"

Marshal.dump([1, 2, {"12" => [:foo]}], 3)
ArgumentError: exceed depth limit
  
      
  • 如果定义了marshal_dump,为什么_dump优先于wobject
  •   

原因是你不应该同时在你的班级中定义它们,只能其中一个。无论如何必须首先检查其中一个。检查是在marshal.c的{{1}}函数上完成的。

答案 1 :(得分:1)

关于深度

假设:

h={'one'=>{'two'=>{'three'=>0}}}; p Marshal.dump(h,3)

将发出:

ArgumentError: exceed depth limit

意味着元帅必须超出给定的深度限制来编组对象(3个哈希值+最后一个哈希值的'键值'级别)

鉴于:

h={'one'=>{'two'=>{'three'=>0}}}; p Marshal.dump(h,4)

将起作用:

"\x04\b{\x06I\"\bone\x06:\x06ET{\x06I\"\btwo\x06;\x00T{\x06I\"\nthree\x06;\x00Ti\x00"