序列化图形时出现异常

时间:2011-05-25 15:58:22

标签: c# protobuf-net

我还在玩新发布的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,它就不会!不幸的是,上面的行只是为了说明问题而写的,我需要这个属性用于我正在使用的真实结构。

所以我的问题是......它是一个已知的问题,是否有任何补丁计划很快修复它?或者有人知道任何解决方法吗?

由于

1 个答案:

答案 0 :(得分:3)

这只是一个错误(感谢你如此彻底地运用测试版!) - 在动态/引用处理中它重复计算对象(曾经作为shim包装器的一部分,它欺骗了魔术,一次对象本身)。

为了提高效率,递归检测只能在超出特定深度的情况下进入全速档。你的代码绊倒了这个深度,导致重复计算被视为递归。我已在代码中修复此问题。上面的代码在本地传递,并将在下一个下降。