gpt4 book ai didi

c# - 反序列化失败 - C#

转载 作者:行者123 更新时间:2023-12-03 12:06:54 25 4
gpt4 key购买 nike

我写了一些代码,它是一个迷你简单的信使程序模仿。
在节目中;当用户注销时,我的 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);
}

}

//序列化/反序列化类

公共(public)类 SerializationHelper
{
公共(public)静态字节 [] 序列化(对象 obj)
{
BinaryFormatter 格式化程序 = new BinaryFormatter();
MemoryStream 流 = 新的 MemoryStream();
尝试
{
格式化程序.序列化(流,obj);
}
捕捉(异常(exception))
{
MessageBox.Show("序列化 Edilemiyor");
}
流.位置 = 0;
返回流.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;
}




}

最佳答案

我看到的问题是,一旦数据从管道中下来,您就试图对其进行反序列化。由于数据包是如何通过网络发送的,这可能会也可能不会。

您应该在消息中发送一个 header ,指示数据的长度(以字节为单位)。然后,您接收字节,直到该数字被击中,然后才反序列化。

您的 header 应具有特定格式并具有特定长度,以便在开始时轻松将其取下。

关于c# - 反序列化失败 - C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2552934/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com