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