2013-05-06 61 views
2

这是推动我疯了,现在,我目前正在写一些客户端/服务器软件,我可以把客户端之间的阵列没有问题,但问题就出在这个代码在这里:序列化类丢失的数据

MemoryStream fs = new MemoryStream(); 
BinaryFormatter formatter = new BinaryFormatter(); 
lock (fs) 
     lock (sharedVars.clients[i]) 
      formatter.Serialize(fs, sharedVars.clients[i]); 
    sender.SendData(setFirstByte(Game_Project_no._14wI542Z.Shared.Constants.InitialByte.REQUEST_RTN, fs.ToArray())); 

我运行代码和断点,我可以看到内存流中包含的数据来自序列化,但它永远不会将它传送到另一台计算机(实际上这通过本地主机来避免实际的网络硬件错误)。

这是使用TCP和真正的疯狂的部分是,如果我手动写入一个新的字节数组到存储流数据到另一侧没有问题,本质上它只是不喜欢序列化的数据。现在我真的很困惑,所以我向社区提出问题,有什么想法?

更多参考这就是被调用时完全空数组(巴在开始request_rtn字节)到达另一端:

Shared.SharedValues.Client clientTemp; 

readBuffer = removeFirstByte(readBuffer); 

BinaryFormatter formatter = new BinaryFormatter(); 
MemoryStream ms = new MemoryStream(readBuffer); 

ms.Position = 0; 

lock (serverValues) 
    clientTemp = (Shared.SharedValues.Client)formatter.Deserialize(ms); 

serverValues.clients[clientTemp.ID] = clientTemp; 

再换在服务器端,我改变的代码测试它,它在各方面的工作:

MemoryStream fs = new MemoryStream(); 
BinaryFormatter formatter = new BinaryFormatter(); 

byte[] byteArray = new byte[10000]; 

for (i = 0; i < 10000; i++) 
{ 
    byteArray[i] = (byte)i; 
} 

lock (fs) 
    lock (sharedVars.clients[i]) 
     //formatter.Serialize(fs, sharedVars.clients[i]); 
     fs.Write(byteArray, 0, 10000); 
    sender.SendData(setFirstByte(Game_Project_no._14wI542Z.Shared.Constants.InitialByte.REQUEST_RTN, fs.ToArray())); 
+0

你检查了fs.toArray()的内容吗? – 2013-05-06 21:02:23

+0

在这两种情况下,它们都包含我所期望的。 – 2013-05-06 21:05:28

+0

客户端和服务器都使用'Shared.SharedValues.Client'的相同类定义吗? – rsbarro 2013-05-06 21:05:59

回答

1

多玩弄围绕我结束了简单地使用缓冲区写入到自身解决问题后:

fs.Write(fs.GetBuffer(), 0, fs.Capacity); 

我觉得必须有一个编译器错误或者正在发生的事情,然而这说服了它的行为。现在我将转向现在出现的其他问题。

废品很多,事实证明,上面的行没有任何帮助,真正的错误是,我正在做一个异步写入,几乎立即正在写入网络的缓冲区被破坏,这实质上意味着1或2个字节通过,然后加载0。所以对于将来遇到这个问题的任何人,确保你没有像我这样愚蠢。

非常感谢你们的一些人为了弄清楚发生了什么。