protobuf-net слияние - PullRequest
       4

protobuf-net слияние

1 голос
/ 23 апреля 2011

Около 2 недель у меня была странная проблема, я действительно не могу обернуть голову.

Быстрый фон: В моем серверном приложении я создаю серию объектов (каждый объект с префиксами длиной 32 бита), и каждый раз я посылаю кучу объектов клиенту. Этим занимается Лидгрен, который достаточно надежен, и я не думаю, что это является причиной моих проблем.

На моем клиенте я делаю это (также стоит отметить, что Object.Base наследуется тоннами объектов):

public void ReadEntities(NetIncomingMessage Message)
{
     int Count = Message.ReadInt32();
     for (int i = 0; i < Count; i++)
     {
          ReadObject(Message);
     }
}

public void ReadObject(NetIncomingMessage Message)
{
     int Length = Message.ReadInt32();
     Deserialize(Message.ReadBytes(Length));
}

public Object.Base Deserialize(byte[] Bytes)
{
        MemoryStream SerializeStream = new MemoryStream(Bytes);
        Object.Base NewObject = Serializer.Deserialize<Object.Base>(SerializeStream);
        Object.Base ObjectExist = null;
        ObjectExist = Scene.GetEntity(NewObject.ID);

        if (ObjectExist == null)
        {
            NewObject.Initialize();
            return NewObject;
        }
        else
        {
            SerializeStream.Seek(0, SeekOrigin.Begin);
            Serializer.Merge<Object.Base>(SerializeStream, ObjectExist);
            return ObjectExist;
        }
}

Работает отлично ... обычно. Несколько обновлений происходит, когда объекты десериализуются и объединяются правильно. Однако через несколько секунд появляется сообщение об ошибке StackOverflowException в protobuf-net или mscorlib. Эта ошибка исчезает, когда я закомментирую строку Serializer.Merge. Естественно, мне в значительной степени нужно использовать Merge для работы этого дизайна обновления. Кроме того, он явно способен десериализоваться, поскольку я закомментирую только строку слияния; это слияние, которое является проблематичным. Действительно в конце моего ума для этого.

1 Ответ

0 голосов
/ 23 апреля 2011

Ох, это ... странно; Я не делаю ничего недетерминированного там (я автор, кстати). Я не думаю, что у меня достаточно для репродукции (в частности, я не знаю ни вашей типовой модели, ни ваших конкретных данных).

Я более чем рад помочь, но мне может понадобиться немного больше, чтобы воспроизвести это. В Visual Studio вы можете , как правило, захватывать часть разорванного стека в окне "Call Stack", что должно дать некоторое представление о том, в чем проблема. В качестве альтернативы, если вы сможете публиковать более конкретную информацию (чтобы я мог ее воспроизвести), либо здесь, либо непосредственно, мы дойдем до сути.

Я собираюсь сделать предположение, что вы используете r282 (текущая загружаемая dll); Вы можете также попробовать использовать альфа-сборку v2; так как я не знаю, в чем проблема (пока), я не могу утверждать, что это исправит это, но если это действительно работает надежно, это укажет на ошибку в v1 (r282).

Другая возможность состоит в том, что в вашей типовой модели есть нечто, связывающее его в узлы; возможно какой-то нетипичный метод получения / установки, вызывающий проблемы.

...