与ruby'Marshal'概念的混淆
说: 序列化obj和所有子对象。如果指定了IO,则序列化数据将写入其中,否则数据将作为字符串返回如果指定了限制,子对象的遍历将限制在该深度。如果极限为负值,则不会执行深度检查 现在我的问题是:与ruby'Marshal'概念的混淆,ruby,marshalling,Ruby,Marshalling,说: 序列化obj和所有子对象。如果指定了IO,则序列化数据将写入其中,否则数据将作为字符串返回如果指定了限制,子对象的遍历将限制在该深度。如果极限为负值,则不会执行深度检查 现在我的问题是: 什么是深度 你能给我举一个反对粗线条的例子吗 如果两者都已定义,为什么封送转储将优先于\u转储 关于深度 鉴于: h={'one'=>{'two'=>{'three'=>0}}}; p Marshal.dump(h,3) 将发布: ArgumentError: exceed dep
- 什么是深度
- 你能给我举一个反对粗线条的例子吗
- 如果两者都已定义,为什么
将优先于封送转储
\u转储
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"
- 什么是深度
- 你能给我举一个反对粗线条的例子吗
[1,2,{“12”=>[:foo]}]
的深度级别是4:
- 第一级:
[1,2,{“12”=>[:foo]}]
- 第二级:
、1
和2
{“12”=>[:foo]}
- 第三级:
和“12”
[:foo]
- 第四级:
:foo
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
- 如果两者都已定义,为什么
将优先于封送转储
\u转储
原因是您不应该在类中同时定义它们,而应该只定义其中一个。无论如何,必须先检查其中一个。检查是在函数
wobject
from上完成的。没有得到两个散列之间的差异。看来两者是平等的。他们有什么不同?该死。抱歉,忘记更改Marshal.dump调用中的级别。数组都是相同的本质,你告诉封送员:“如果你不能封送我在x层内给你的对象,请引发一个错误”,这样它就可以在通过深度验证的4层深度下完全封送对象,所以你得到了封送的对象回望这里的对象是h
-如何确定深度
?我想假设它是3个层次,3个对象深度是有意义的,但它似乎是+1?不知道为什么。也许有更深入的知识的人可以帮助您,outdoc说-如果指定了限制,子对象的遍历将限制在该深度
。那么为什么不允许3
?正如它所说的,我们可以限制子对象的横向深度?只要限制允许,它就会继续。如果无法生成对象的完整转储,它将失败,因为无法返回部分和有效转储。为什么Marshal.dump([1,2,{“12”=>[:foo]}],5)
允许?我对这条粗体线的混淆仍然不清楚。因为编组该阵列的深度不超过5级,所以只有4级,所以没有违反您给出的深度屏障Marshal.dump([1,2,{“12”=>[:foo]}],1000)
它仍然可以工作,但是Marshal.dump([1,2,{“12”=>[:foo]}],3)
深度太小了