序列化obj和所有后代对象。如果指定了IO,则会将序列化数据写入其中,否则数据将作为String返回。 如果指定了限制,则子对象的遍历将限制为该深度 。如果限制为负,则不会执行深度检查。
现在我的问题是:
什么是深度?
你能举一个反对粗线的例子吗?
如果定义了
marshal_dump
,为什么_dump
优先于{{1}}?
答案 0 :(得分:2)
- 什么是深度?
- 你能举一个反对粗线的例子吗?
当编组对象时,它可以引用另一个对象,该对象可以引用另一个对象。深度级别:[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
的{{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"