日期:2014-05-17  浏览次数:21081 次

C#反序列化数据后,使用as转换对象出错
一个简单的C/S程序,使用的UDP数据报,Client端登陆时创建一个User对象,然后发送给Server端,Server端进行验证,可是Server端将Client端发来的数据反序列化后使用as转换失败,值为null。请大家帮忙看一下什么问题:

Client端:

    MemoryStream memStream = new MemoryStream();
    BinaryFormatter formatter = new BinaryFormatter();
    //自己定义的一个与服务器端进行沟通的累
    ContactWithServer contactWithServer;  

    formatter.Serialize(memStream, user);
    data = memStream.ToArray();
    contactWithServer.sendData(data,data.Length);

Server端:

    data  = receiveUdpClient.Receive(ref ipep);   //从客户端接收数据报
    memStream = new MemoryStream(data);
    memStream.Seek(0, SeekOrigin.Begin);
    Object obj = formatter.Deserialize(memStream);
    User user =  obj as User;
    if(user == null)
         MessageBox.Show("空对象");

------解决方案--------------------
MessageBox.Show(obj.GetType().ToString()); //输出什么
User user =  obj as User;
------解决方案--------------------
服务器、客户端用的User要是同一个assembly中的,不能是两份User定义(即使定义成一样的)
------解决方案--------------------
建立一个dll包含User
两端同时引用他
------解决方案--------------------
只要引用的是同一项目(比如类库项目)里的User类,应该是可以的。反序列化说白了就是传输xml并转化为实体对象的过程。
------解决方案--------------------
引用:
Quote: 引用:

服务器、客户端用的User要是同一个assembly中的,不能是两份User定义(即使定义成一样的)


这个该怎么弄呢,新生啥也不懂。。。


你的model定义文件需要在客户端也有一份一摸一样的。

你可以在客户端程序解决方案上,点击鼠标右键,选择服务器端工程里的model文件,然后不要选择“打开”而要选择“添加为链接”,例如这个图:



当然你也可以总是copy文件然后分别放到不同工程里。但是保持两份,就多一倍的出错几率。
------解决方案--------------------