我还在玩新发布的protobuf-net版本,我正面临一个我不明白的问题。
让我们考虑以下代码:
[ProtoContract]
class Node
{
public Node()
{
Children = new List<Node>();
}
[ProtoMember(1, IsRequired = true)]
public int Data { get; set; }
[ProtoMember(2, IsRequired = true, AsReference = true)]
public List<Node> Children { get; set; }
public void AddChild(Node child)
{
Children.Add(child);
}
}
static void Main()
{
Node n = new Node {Data = 0}, root = n;
for (int i=1; i<15; i++)
{
Node child = new Node {Data = i};
n.AddChild(child);
n = child;
}
Node clone = Serializer.DeepClone(root);
}
它抛出类型ProtoException
的异常,并显示消息“检测到可能的递归...”
有趣的是,如果我删除AsReference
属性上的属性Children
,它就不会!不幸的是,上面的行只是为了说明问题而写的,我需要这个属性用于我正在使用的真实结构。
所以我的问题是......它是一个已知的问题,是否有任何补丁计划很快修复它?或者有人知道任何解决方法吗?
由于
答案 0 :(得分:3)
这只是一个错误(感谢你如此彻底地运用测试版!) - 在动态/引用处理中它重复计算对象(曾经作为shim包装器的一部分,它欺骗了魔术,一次对象本身)。
为了提高效率,递归检测只能在超出特定深度的情况下进入全速档。你的代码绊倒了这个深度,导致重复计算被视为递归。我已在代码中修复此问题。上面的代码在本地传递,并将在下一个下降。