C# 当对象作为数据包发送时,无法反序列化该对象

C# 当对象作为数据包发送时,无法反序列化该对象,c#,serialization,udp,C#,Serialization,Udp,我正在努力学习udp套接字等。。。。我创建了两个程序服务器和客户端。客户端向服务器发送一个数据包,服务器将其反弹回来 这是我在两个程序中使用的代码,用于将数据转换为字节[]或从字节[]转换为数据 但是我从字节[]转换时出错 public static Packet Open(byte[] b) { MemoryStream memStream = new MemoryStream(); BinaryFormatter binForm

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

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

但是我从字节[]转换时出错

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);
我收到的错误是“在我的客户端程序名中找不到程序集”


有什么想法吗?

在我看来,您正在序列化一个类型,而该类型不是通过两端之间的引用共享的。注意:将同一个类编译成这两个类是不够的,因为BinaryFormatter包含包括程序集在内的完整类型名,因此:它仍将被视为不相关的类型。常见的修复方法是(我完全错误地使用了“fix”一词)是为DTO编写一个程序集,并从客户端和服务器引用该程序集


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

这听起来像是我的问题。我不想使用第三方的东西,我正在尝试学习如何使用它。因此我必须编写一个类,将其转换为dll,并在两个应用程序中引用它,对吗