繁体   English   中英

反序列化失败-C#

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM