исключение при сериализации графа - PullRequest
3 голосов
/ 25 мая 2011

Я все еще играю с недавно выпущенной версией 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 Ответ

3 голосов
/ 26 мая 2011

Это просто ошибка (спасибо за тщательное выполнение бета-тестирования!) - при обработке динамических ссылок и ссылок он дважды подсчитывал объект (один раз как часть оболочки-обертки, он подделывает магию, а один раздля самого объекта).

Для эффективности обнаружение рекурсии включается только в полную передачу за пределами определенной глубины.Ваш код сработал на эту глубину, в результате чего двойной счет считается рекурсией.Я исправил это в коде.Код выше проходит локально, и будет в следующей капле.

...