【问题标题】:What is the Best Way to handle Parent-Child relationships with ProtoBuf-Net使用 ProtoBuf-Net 处理父子关系的最佳方法是什么
【发布时间】:2012-10-23 15:48:04
【问题描述】:

在我使用 ProtoBuf 进行序列化的测试应用程序中引发了此异常。

SceneryFile:temp.ad2
ProtoBuf.ProtoException: Possible recursion detected (offset: 2 level(s): SceneryFile: temp.ad2
at ProtoBuf.ProtoWriter.CheckRecursionStackAndPush(Object instance( in c:\protbuf-net\protobuf-net\ProtoWriter.sc:line321

我发现了这些其他问题

protobuf-net: Possible recursion detected

Protobuf-net possible recursion detected: serialize children and parents

我的树的深度只有 4。我查看是否可以更改 ProtoBuf.ProtoWriter.RecursionCheckDepth,但在我的代码中找不到这样做的方法。

基于 Marc 对最后一个问题的回答,我认为这意味着通过引用再次引用同一个对象实例 - 所以在我的情况下,SceneryFile 是指自己或被引用到其他地方(实际上它是基础班级)。从某种意义上说,所有的直系子代都持有对它的引用。这里的答案似乎表明这可能是问题所在:

根据上面第二个问题的发现,我将父级从序列化中删除,这确实解决了这个问题。

有什么方法可以让我在序列化中保持对父级的引用,还是我需要做一些事情,比如为父级使用索引,然后在我反编译时重建图形?

谢谢

【问题讨论】:

    标签: c# protobuf-net


    【解决方案1】:

    “递归检查深度”是一个优化细节仅限:为了避免不断检查每个对象的递归开销,它只检查深度是否高于此。什么是有效/无效是没有区别的。

    这里有两种方法。我的首选是仅序列化“子”关系,并使用反序列化后回调,然后循环遍历子级并设置其父级属性。这是通过回调属性完成的,通常是 5 行代码。

    另一个是告诉 protobuf-net 尊重引用(在成员上将 AsReference 设置为 true)。这会改变布局,如果您想与不同的(非 protobuf-net)实现互操作,则不适合。

    我也可以添加两个 ir 的示例,但不能在手机上!

    【讨论】:

    • 马克 谢谢。我的首选路线当然不会将链接序列化回父级。反序列化后,将父级重新分配给子级将非常容易。
    • @Scruffy 你熟悉反序列化后的回调吗?或者你想要一个例子?
    • 不,我不是马克。一个例子将是一个很大的帮助,非常感谢。乔恩
    猜你喜欢
    • 2021-09-10
    • 1970-01-01
    • 2010-09-06
    • 2021-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多