Nservicebus serization issue of derived types
- by Tiju John
Hi Guys,
for the context setting, I am exchanging messages between my nServiceBus client and nSerivceBus server. its is the namespace xyz.Messages and and a class, Message : IMessage
I have more messages that are in the other dlls, like xyz.Messages.Domain1, xyz.Messages.Domain2, xyz.Messages.Domain3.
and messages that derive form that base message, Message.
I have the endpoints defined as like :
at client
<UnicastBusConfig>
<MessageEndpointMappings>
<add Messages="xyz.Messages" Endpoint="xyzServerQueue" />
<add Messages="xyz.Messages.Domain1" Endpoint="xyzServerQueue" />
<add Messages="xyz.Messages.Domain2" Endpoint="xyzServerQueue" />
</MessageEndpointMappings>
</UnicastBusConfig>
at Server
<UnicastBusConfig>
<MessageEndpointMappings>
<add Messages="xyz.Messages" Endpoint="xyzClientQueue" />
<add Messages="xyz.Messages.Domain1" Endpoint="xyzClientQueue" />
<add Messages="xyz.Messages.Domain2" Endpoint="xyzClientQueue" />
</MessageEndpointMappings>
</UnicastBusConfig>
and the bus initialized as
IBus serviceBus = Configure.With()
.SpringBuilder()
.XmlSerializer()
.MsmqTransport()
.UnicastBus()
.LoadMessageHandlers()
.CreateBus()
.Start();
now when i try sending instance of Message type or any type derived types of Message, it successfully sends the message over and at the server, i get the proper type.
eg.
Message message= new Message();
Bus.Send(message); // works fine, transfers Message type
message = new MessageDerived1();
Bus.Send(message); // works fine, transfers MessageDerived1 type
message = new MessageDerived2();
Bus.Send(message); // works fine, transfers MessageDerived2 type
My problem arises when any type, say MessageDerived1, contains a member variable of type Message, and when i assign it to a derived type, the type is not properly transferred over the wire. It transfers only as Message type, not the derived type.
public class MessageDerived2 : Message
{
public Message message;
}
MessageDerived2 messageDerived2= new MessageDerived2();
messageDerived2.message = new MessageDerived1();
message = messageDerived2;
Bus.Send(message); // incorrect behaviour, transfers MessageDerived2 correctly, but looses type of MessageDerived2.Message (it deserializes as Message type, instead of MessageDerived1)
any help is strongly appreciated.
Thanks
TJ