1

我正在尝试学习 udp 套接字等。我创建了两个程序服务器和客户端。客户端向服务器发送数据包,服务器将其弹回。

这是我在两个程序中用于将数据转换为字节 [] 和从字节 [] 转换的代码

但是从 byte[] 转换时出现错误

public static Packet Open(byte[] b)
        {
            MemoryStream memStream = new MemoryStream();
            BinaryFormatter binForm = new BinaryFormatter();
            memStream.Write(b, 0, b.Length);
            memStream.Seek(0, SeekOrigin.Begin);
            object obj = new object();
            try
            {
                // this line here is where the error is occurring
                obj = (object)binForm.Deserialize(memStream);
            }
            catch (Exception er)
            {
                MessageBox.Show(er.Message);
            }
            if (obj is Packet)
                return (Packet)obj;
            else
                return null;
        }

        public byte[] Bundle()
        {
            BinaryFormatter bf = new BinaryFormatter();
            MemoryStream ms = new MemoryStream();
            bf.Serialize(ms, this);
            return ms.ToArray();
        }

如果我这样做,所有来自一个程序的工作

Packet p =new Packet();
p.Message="hello";

byte[] data = p.Bundle();

Packet p2 = Packet.Open(data);
MessageBox.Show(p2.Message);

我收到的错误是“无法在“我的客户端程序的名称”中找到程序集

有任何想法吗?

4

1 回答 1

2

在我看来,您正在序列化一个不通过两端之间的引用共享的类型。注意:将同一个类编译到两者中是不够的,因为 BinaryFormatter 包括完整的类型名称,包括程序集,所以:它仍然算作不相关的类型。那里的常见修复(我完全错误地使用“修复”这个词)是为 DTO 编写一个程序集并从客户端和服务器引用该程序集。但是,这种方法仍然存在许多问题。

有关信息,还有其他序列化程序在每一端都有一个类似的类兼容。我有偏见,但我建议看看 protobuf-net;输出通常要小得多,并且与类型无关,这意味着该类只需要在每一端都大致相似(它非常容忍版本)。此外,它也更快(CPU 方面)!

于 2012-07-12T14:28:56.957 回答