我正在尝试学习udp套接字等....我创建了两个程序服务器和客户端。客户端将数据包发送到服务器,服务器将其反弹。
这是我在两个程序中使用的代码,用于将数据转换为byte []
但是从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);
我收到的错误是“无法在我的客户端程序名称中找到程序集”
AnyIdeas?
答案 0 :(得分:2)
在我看来,您正在序列化两端之间未通过引用共享的类型。注意:将两个相同的类编译成两者是不够的,因为BinaryFormatter包含完整的类型名称,包括程序集,因此:它仍将被视为不相关的类型。那里的常见修复(我完全错误地使用“修复”一词)是为DTO编写程序集并从客户端和服务器引用该程序集。不过,这种方法仍有很多问题。
有关信息,还有其他序列号 兼容,只是在每一端都有类似的类。我有偏见,但我建议看一下protobuf-net;输出通常要小得多,并且它与类型无关,这意味着类必须在每一端都大致相似(它是非常容易版本的)。此外,它也更快(以CPU为单位)!