gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 02:42:59 24 4
gpt4 key购买 nike

嘿伙计们,我正在制作一个聊天程序,我有一个父“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/

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