往消息队列中写数据时,是定义了一个基类,然后客户端继承这个基类定义了一个新的类型,然后转化为基类,这样写到消息队列中的。
当我取数据时,
Message message=new Message();
message.Body 这里会报异常:无法反序列化,未知的对象,我的子类是在客户端写的,服务端不知道这个子类,只知道用基类来反序列化,是否是这个原因,需要已知子类,并且用子类才能序列化?
我可以把子类写成单独的DLL,能通过加载程序集让服务端知道这个子类吗?
关键是我不想在接收数据的时候,用子类来反序列化,在定义xmlFormatter时,我想用基类,可以吗?
是的,服务端必须要知道子类,用基类不行。
如果不想反序列化子类,那么你在客户端序列化的时候要是用基类。
我在客户端序列化时,用的是基类啊,为什么还是报异常,难道必须用真实的类型来反序列化吗,如果想在客户端扩展怎么办?
@cloud_915: 我不太明白你是什么意思。服务接口能够接收什么样的序列化类型是由服务端定义的,客户端可以使用匹配的类型来适配服务端的定义。也就是说,你不能客户端发一个服务器没有的类型,客户端的已知类型必须从服务端的定义导出。
@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。
这样做可以实现功能了,但是不知道这么是否会有问题。再次求教下,谢谢。
如果能不转字节数组就能实现的办法最好。
@cloud_915: 你可以运行下这段代码:
XmlSerializer formater = new XmlSerializer(typeof(ABase));
ABase a=new BClass();
MemoryStream ms = new MemoryStream();
formater.Serialize(ms,a);