[英]Deserialization Failure - C#
我写了一些代码,是对Messenger程序的一个简单的模仿。 在程序中; 当用户注销时,我的LogOutCommand类的实例由客户端程序准备,序列化并发送到服务器。 服务器收到LogOutCommand时,将反序列化并调用该类的Execute方法,该方法执行db操作等。
问题在于,有时Server可以很好地反序列化,但是有时会失败。 据我了解,服务器有时会开始反序列化,然后完全准确地发送关联的字节。
如何使服务器以等待所有相关字节发送完毕的方式启动反序列化?
还是您认为还有另一个问题?
这是代码:
//服务器监听套接字
private void ReadData(object obj)
{
Socket client = (Socket)obj;
while (true)
{
if (client.Available > 0)
{
byte[] buffer = new byte[client.Available];
client.Receive(buffer);
ServerCommandBase cmd = CommandReader.ReadSrvCommand(buffer);
cmd.Execute(context);
}
}
}
// CommandReader类
public class CommandReader
{
public static ServerCommandBase ReadSrvCommand(byte[] buffer)
{
return (ServerCommandBase)SerializationUtility.SerializationHelper.Deserialize(buffer);
}
public static ClientCommandBase ReadCliCommand(byte[] buffer)
{
return (ClientCommandBase)SerializationUtility.SerializationHelper.Deserialize(buffer);
}
}
//序列化/反序列化类
公共类SerializationHelper {公共静态字节[] Serialize(object obj){BinaryFormatter formatter = new BinaryFormatter(); MemoryStream流=新的MemoryStream(); 尝试{formatter.Serialize(stream,obj); } catch(Exception){MessageBox.Show(“ Serialize Edilemiyor”); }
stream.Position = 0; 返回stream.ToArray(); }
public static object Deserialize(byte[] byteArr)
{
BinaryFormatter formatter = new BinaryFormatter();
MemoryStream ms = new MemoryStream(byteArr);
ms.Position = 0;
object retObj = null;
try
{
retObj = formatter.Deserialize(ms);
}
catch (Exception)
{
MessageBox.Show("Cannot Be Deserialized!");
}
return retObj;
}
}
我所看到的问题是,您试图在管道中尽快对数据进行反序列化。 由于数据包是如何通过网络发送的,因此这可能或不可能。
您应该发送带有消息的标头,以指示数据的长度(以字节为单位)。 然后,您将字节取入,直到该数字被击中,然后才进行反序列化。
您的标头应采用特定格式,并具有特定长度,以便在开始时轻松将其取下。
首先,您不应该使用BinaryFormatter。 最好使用XmlSerializer。
其次,请包括您获得的异常详细信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.