与ruby'Marshal'概念的混淆

与ruby'Marshal'概念的混淆,ruby,marshalling,Ruby,Marshalling,说: 序列化obj和所有子对象。如果指定了IO,则序列化数据将写入其中,否则数据将作为字符串返回如果指定了限制,子对象的遍历将限制在该深度。如果极限为负值,则不会执行深度检查 现在我的问题是: 什么是深度 你能给我举一个反对粗线条的例子吗 如果两者都已定义,为什么封送转储将优先于\u转储 关于深度 鉴于: h={'one'=>{'two'=>{'three'=>0}}}; p Marshal.dump(h,3) 将发布: ArgumentError: exceed dep

说:

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

现在我的问题是:

  • 什么是深度

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

  • 如果两者都已定义,为什么
    封送转储
    将优先于
    \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递归查找的级别:

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)
深度太小了