1

元帅#dump说:

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

现在我的问题是:

  • 什么是深度?

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

  • 如果两者都被定义,为什么marshal_dump会优先?_dump

4

2 回答 2

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

编组一个对象时,它可以引用另一个对象,该对象可以引用另一个对象。this的深度级别:[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

原因是你永远不应该在你的类中同时定义它们,只定义其中一个。无论如何,必须先检查其中一个。检查是在函数中完成wobjectmarshal.c

于 2013-04-07T12:30:03.847 回答
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"
于 2013-04-07T11:51:25.147 回答