将对象作为数据包发送时无法反序列化对象

时间:2012-07-12 14:24:16

标签: c# serialization udp

我正在尝试学习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?

1 个答案:

答案 0 :(得分:2)

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

有关信息,还有其他序列号 兼容,只是在每一端都有类似的类。我有偏见,但我建议看一下protobuf-net;输出通常要小得多,并且它与类型无关,这意味着类必须在每一端都大致相似(它是非常容易版本的)。此外,它也更快(以CPU为单位)!