【问题标题】:Error deserializing objects from MemoryStream从 MemoryStream 反序列化对象时出错
【发布时间】:2019-01-08 08:17:25
【问题描述】:

我正在尝试将一个序列化对象从客户端发送到服务器,服务器将其作为字节数组读取,使用字节数组创建内存流,然后使用内存流进行反序列化。

它第一次正常工作,但是当第一个客户端断开连接并且第二个客户端连接并发送对象时,我得到了这个:

二进制流“0”不包含有效的 BinaryHeader。

没有对象类型“”的程序集 ID。

这是发生错误的地方:

    private static async void HandleClient(TcpClient tcpClient)
    {
        NetworkStream networkStream;

        try
        {
            networkStream = tcpClient.GetStream();
            byte[] buff = new byte[1024];

            while (true)
            {
                int recieved = await networkStream.ReadAsync(buff, 0, buff.Length);

                if (recieved == 0)
                {
                    Console.WriteLine("Client disconnected.");
                    break;
                }

                using (MemoryStream memoryStream = new MemoryStream(buff))
                {
                    IFormatter formatter = new BinaryFormatter();
                    object obj = formatter.Deserialize(memoryStream);
                    if (obj is PersonData)
                    {
                        PersonData data = (PersonData)obj;
                        Console.WriteLine($"{data.name} - {data.age} - {data.gender}");
                    }
                }
                Array.Clear(buff, 0, buff.Length);
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
        }
    }

【问题讨论】:

  • 为什么是 1024 字节?如果序列化的对象比这个大怎么办?
  • 我这样做只是为了在我尝试在实际应用程序上实现它之前更好地了解如何通过网络发送对象。我发送的测试对象仅包含 2 个字符串和一个整数,我认为缓冲区大小不是问题,因为它第一次工作并且我第二次使用完全相同的对象。

标签: c# sockets tcp deserialization memorystream


【解决方案1】:

原来问题出在我客户的代码中。我将它直接序列化为网络流,而不是仅仅将对象转换为字节数组并发送数组。

【讨论】:

    猜你喜欢
    • 2012-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多