元帅#dump说:
序列化 obj 和所有后代对象。如果指定了 IO,则将序列化的数据写入其中,否则数据将作为 String 返回。如果指定了限制,则子对象的遍历将被限制在该深度。如果 limit 为负数,则不会执行深度检查。
现在我的问题是:
什么是深度?
你能给我一个反对粗线的例子吗?
如果两者都被定义,为什么
marshal_dump
会优先?_dump
元帅#dump说:
序列化 obj 和所有后代对象。如果指定了 IO,则将序列化的数据写入其中,否则数据将作为 String 返回。如果指定了限制,则子对象的遍历将被限制在该深度。如果 limit 为负数,则不会执行深度检查。
现在我的问题是:
什么是深度?
你能给我一个反对粗线的例子吗?
如果两者都被定义,为什么
marshal_dump
会优先?_dump
- 什么是深度?
- 你能给我一个反对粗线的例子吗?
编组一个对象时,它可以引用另一个对象,该对象可以引用另一个对象。this的深度级别:[1, 2, {"12" => [:foo]}]
为4:
[1, 2, {"12" => [:foo]}]
1
:2
和{"12" => [:foo]}
"12"
和[:foo]
: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
。
关于深度
鉴于:
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"