大约两个星期我一直遇到一个奇怪的问题,我实在无法解决这个问题。
快速背景: 在我的服务器应用程序上,我创建了一系列对象(每个对象具有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来实现这个更新设计。此外,它显然能够反序列化,因为我只注释掉合并线;它的合并是有问题的。真的在我的智慧结束了这一点。
答案 0 :(得分:0)
我非常乐意提供帮助,但我可能需要更多来重现这一点。在Visual Studio中,您可以通常捕获“调用堆栈”窗口中的部分堆栈,这应该可以指出问题所在。或者,如果您能够在此处或直接发布更具体的信息(以便我可以重现它),我们将深入了解它。
我将假设您正在使用r282(当前可下载的dll);你可以也尝试使用v2的alpha版本;因为我不知道问题是什么(还)我不能说这会解决它,但如果 可靠地工作,它将指向v1(r282)中的错误。
另一种可能性是你的类型模型中有一些东西将它绑在一起;也许是一些导致问题的非典型吸气剂/设定器。