使用ProtoBuf-Net处理父子关系的最佳方法是什么?

时间:2012-10-23 15:48:05

标签: c# protobuf-net

我的测试应用程序抛出此异常以使用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指的是自身或被引用到其他地方(实际上它是基础类)。从某种意义上说,所有直接的孩子都会参考它。这里的答案似乎表明这可能是问题所在:

根据上面第二个问题的结果,我删除了父级序列化,这确实阻止了这个问题。

是否有某种方法可以让我像序列化一样保持对父级的引用,或者我是否需要为父级使用索引,然后在反编译时重新构建图形?

由于

1 个答案:

答案 0 :(得分:3)

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

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

另一种方法是告诉protobuf-net尊重引用(在成员上将AsReference设置为true)。这会改变布局,如果你想要互操作到另一个(非protobuf-net)实现,那就不合适了。

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