首页 新闻 会员 周边

消息队列在接收数据,反序列化时报异常,提示未知类型

0
[已解决问题] 解决于 2013-09-03 21:41

往消息队列中写数据时,是定义了一个基类,然后客户端继承这个基类定义了一个新的类型,然后转化为基类,这样写到消息队列中的。

当我取数据时,

Message message=new Message();

message.Body 这里会报异常:无法反序列化,未知的对象,我的子类是在客户端写的,服务端不知道这个子类,只知道用基类来反序列化,是否是这个原因,需要已知子类,并且用子类才能序列化?

我可以把子类写成单独的DLL,能通过加载程序集让服务端知道这个子类吗?

关键是我不想在接收数据的时候,用子类来反序列化,在定义xmlFormatter时,我想用基类,可以吗?

铁手三郎的主页 铁手三郎 | 菜鸟二级 | 园豆:311
提问于:2013-08-27 11:21
< >
分享
最佳答案
0

是的,服务端必须要知道子类,用基类不行。

如果不想反序列化子类,那么你在客户端序列化的时候要是用基类。

奖励园豆:5
Launcher | 高人七级 |园豆:45045 | 2013-08-27 13:03

我在客户端序列化时,用的是基类啊,为什么还是报异常,难道必须用真实的类型来反序列化吗,如果想在客户端扩展怎么办?

铁手三郎 | 园豆:311 (菜鸟二级) | 2013-08-27 13:44

@cloud_915: 我不太明白你是什么意思。服务接口能够接收什么样的序列化类型是由服务端定义的,客户端可以使用匹配的类型来适配服务端的定义。也就是说,你不能客户端发一个服务器没有的类型,客户端的已知类型必须从服务端的定义导出。

Launcher | 园豆:45045 (高人七级) | 2013-08-27 14:04

@Launcher: 下午网不好,没能及时回复;

服务端有一个ABase,客户端调用了服务端提供的类库,然后继承ABase,创建BClass,客户端往消息队列中存数据时,是ABase a=new BClass(); 而message.Fomatter指定了 typeof(ABase),message.Body=a;这样将数据存储到了消息队列中,而服务端在取数据时,设置的message.Fomatter也是ABase,但是就抱异常了,在服务端不知道有BClass的存在,这会报错吗?

以上是我报异常时的思路,现在我换了下思路,在存数据之前先把a转换为字节数组(其他的内置类型应该也可以),在服务端取数据时,设置的Fomatter的类型是typeof(byte[]),这样就可以得到object了,在转换为ABase就得到了a。

这样做可以实现功能了,但是不知道这么是否会有问题。再次求教下,谢谢。

如果能不转字节数组就能实现的办法最好。

铁手三郎 | 园豆:311 (菜鸟二级) | 2013-08-27 20:52

@cloud_915: 你可以运行下这段代码:

XmlSerializer formater = new XmlSerializer(typeof(ABase));

ABase a=new BClass();

MemoryStream ms = new MemoryStream();

formater.Serialize(ms,a);

Launcher | 园豆:45045 (高人七级) | 2013-08-28 09:17
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册