c# - 网络流二进制序列化

标签 c# serialization tcp

嘿伙计们,我正在制作一个聊天程序,我有一个父“MessagePacket”类和一堆子类,用于发送不同类型的数据包,其中包含主聊天窗口的消息,当前人员列表聊天、私聊消息等

在客户端中,我做的第一件事是创建一个“AddClientPacket”并将其序列化/发送到服务器,然后服务器将其反序列化为它的父“MessagePacket”类,该类包含一个类型属性,用于确定要发送的内容使用它获得的通用 MessagePacket 进行转换/执行。

当服务器尝试反序列化它时会导致崩溃,我不确定为什么。下面是一些代码:

--服务器--

    private void HandleClientComm(Object client)
    {
        Client addClient = new Client(clientIds++, ((TcpClient)client).GetStream());

        IFormatter formatter = new BinaryFormatter();


        while (true)
        {
            MessagePacket packet = new MessagePacket();

            try
            {
                packet = (MessagePacket)formatter.Deserialize(addClient.ClientStream);
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }



            switch (packet.Type)
            {
                case MessageType.ALLCHAT:
                    {
                        messages.Enqueue(((AllChatPacket)packet).Message);
                    }
                break;
                case MessageType.ADDCLIENT:
                    {

                        addClient.ClientName = ((AddClientPacket)packet).ClientName;
                        clientNames.Add(addClient.ClientName);
                        clientList.Add(addClient);
                    }
                break;
                case MessageType.REMOVECLIENT:
                   {
                       clientNames.Remove(addClient.ClientName);
                       clientList.Remove(addClient);
                   }
                   break;
                case MessageType.PRIVATECHAT:
                   {

                   }
                   break;
            }
        }
    }

--客户--

    public void ListenToServer()
    {
        AddClientPacket addClient = new AddClientPacket();
        addClient.Type = MessageType.ADDCLIENT;


        name = addClient.ClientName = Interaction.InputBox("Whats your name", "Name?", "", 100, 100);

        try
        {
            formatter.Serialize(clientStream, addClient);
        }
        catch (Exception e)
        {
            MessageBox.Show(e.Message);
            this.Close();
            return;
        }


        while (true)
        {
            if (quit)
            {
                break;
            }

            MessagePacket packet = new MessagePacket();

            try
            {
                packet = (MessagePacket)formatter.Deserialize(clientStream);
            }
            catch (Exception)
            {
                return;
            }

            switch (packet.Type)
            {
                case MessageType.ALLCHAT:
                    {
                        textBox1.Text = textBox1.Text + Environment.NewLine + ((AllChatPacket)packet).Message;
                        textBox1.Refresh();
                    }
                    break;
                case MessageType.NAMELIST:
                    {
                        clientNameList.DataSource = ((NameListPacket)packet).ClientNames;
                    }
                    break;
            }
        }
    }

最佳答案

那就是问题所在。即使它们在您看来“看起来”相同,具有相同的属性,但如果它们在两个不同的程序集中定义,.NET 会将它们视为完全不同的类型,因此不会让您序列化 TypeA 并将其反序列化为 TypeB。您将必须创建一个具有该类定义的 .dll,两者共享。

关于c# - 网络流二进制序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12773129/

相关文章:

c# - 自定义 JsonConverter 在不应该使用 TokenType "EndObject"的情况下获取阅读器

c - 什么时候使用poll C函数的POLLOUT事件?

iphone - 打开 TCP 连接且不发送或接收数据是否会影响 iPhone 电池?

java tcp 服务器到 Android 设备

c# - 将对象列表作为单个响应进行流式传输,并提供进度报告

c# - 如何在 .NET 中构建消息系统?

c# - ASP.NET ajax c# 总是返回未定义

c# - 使用 WCF 将 JSON 对象的一部分序列化和反序列化为字符串

java - 任务在 Spark 中不可序列化

c# - 刷新后保持页面状态