protobuf-net merge stackoverflowexception

时间:2011-04-23 04:17:53

标签: protobuf-net

大约两个星期我一直遇到一个奇怪的问题,我实在无法解决这个问题。

快速背景: 在我的服务器应用程序上,我创建了一系列对象(每个对象具有32位长度的前缀),并且每隔一段时间我就会向客户端发送一堆对象。这是由lidgren处理的,这是非常可靠的,我不认为这是我的问题的原因。

在我的客户端,我这样做(同样,值得一提的是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;
        }
}

它通常很有效。在对象进行反序列化并正确合并的情况下会发生多次更新。几秒钟之后,弹出一个错误,说protobuf-net或mscorlib中存在StackOverflowException。 当我注释掉Serializer.Merge行时,这个错误就消失了。当然,我非常需要使用Merge来实现这个更新设计。此外,它显然能够反序列化,因为我只注释掉合并线;它的合并是有问题的。真的在我的智慧结束了这一点。

1 个答案:

答案 0 :(得分:0)

哦,那是......奇怪的;我没有做任何非确定性的事情(我是作者,顺便说一句)。我不认为我有足够的重复(特别是,我不知道你的类型和你的具体数据)。

我非常乐意提供帮助,但我可能需要更多来重现这一点。在Visual Studio中,您可以通常捕获“调用堆栈”窗口中的部分堆栈,这应该可以指出问题所在。或者,如果您能够在此处或直接发布更具体的信息(以便我可以重现它),我们将深入了解它。

我将假设您正在使用r282(当前可下载的dll);你可以尝试使用v2的alpha版本;因为我不知道问题是什么(还)我不能说这会解决它,但如果 可靠地工作,它将指向v1(r282)中的错误。

另一种可能性是你的类型模型中有一些东西将它绑在一起;也许是一些导致问题的非典型吸气剂/设定器。