wcf - 派生类型的 Nservicebus 序列化问题

标签 wcf xml-serialization nservicebus

对于上下文设置,我在 nServiceBus 客户端和 nSerivceBus 服务器之间交换消息。它是命名空间 xyz.Messages 和一个类 Message : IMessage

我在其他 dll 中有更多消息,例如 xyz.Messages.Domain1、xyz.Messages.Domain2、xyz.Messages.Domain3。 以及从该基本消息 Message 派生的消息。

我将端点定义为:

 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>

在服务器上

<UnicastBusConfig>
 <MessageEndpointMappings>
   <add Messages="xyz.Messages" Endpoint="xyzClientQueue" />
   <add Messages="xyz.Messages.Domain1" Endpoint="xyzClientQueue" />
   <add Messages="xyz.Messages.Domain2" Endpoint="xyzClientQueue" />
 </MessageEndpointMappings>
</UnicastBusConfig>

总线初始化为

        IBus serviceBus = Configure.With()
            .SpringBuilder()
            .XmlSerializer()
            .MsmqTransport()
            .UnicastBus()
            .LoadMessageHandlers()
            .CreateBus()
            .Start();

现在,当我尝试发送 Message 类型的实例或任何派生类型的 Message 时,它​​成功地在服务器上发送了消息,我得到了正确的类型。

例如。

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

当任何类型(比如 MessageDerived1)包含 Message 类型的成员变量时,我的问题就出现了,当我将它分配给派生类型时,该类型没有正确地通过线路传输。它仅作为 Message 类型传输,而不是派生类型。

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)

非常感谢任何帮助。

谢谢 田杰

最佳答案

NServiceBus XmlSerializer 不支持这一点 - 请参阅 http://tech.groups.yahoo.com/group/nservicebus/message/6549 处的主题

BinarySerializer 可以工作,或者您可以实现自定义消息序列化程序。在我看来,对于 XmlSerializer 无法处理的序列化场景,DataContractSerializer 应该是开箱即用的。

请注意,这样做您可能会失去 NSB 消息版本控制支持 - 如果这对您很重要,我建议您重新考虑您的消息设计。

关于wcf - 派生类型的 Nservicebus 序列化问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2816895/

相关文章:

c# - 如何在一个 WCF 请求中发送多个返回值?

nservicebus - 有没有办法将现有应用程序添加为 Servicematrix 中的端点?

wcf - 通过 HTTP 使用 WCF 连接到受密码保护的服务器

c# - 实体对象的 XML 序列化

c# - 将具有关系的数据集转换为嵌套的 json

C# - XML 将复杂类序列化为其原始类型

NServiceBus 在扫描时抛出 stackoverflow

nservicebus - 报告竞争消费者场景进展的方法

.net - WCF服务库与类库项目类型

c# - 最大出站连接数