【问题标题】:Nservicebus serization issue of derived types派生类型的 Nservicebus 序列化问题
【发布时间】:2010-05-12 07:55:29
【问题描述】:

对于上下文设置,我在我的 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= 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)

非常感谢任何帮助。

谢谢 TJ

【问题讨论】:

    标签: wcf xml-serialization nservicebus


    【解决方案1】:

    NServiceBus XmlSerializer 不支持此功能 - 请参阅http://tech.groups.yahoo.com/group/nservicebus/message/6549 处的线程

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

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

    【讨论】:

      【解决方案2】:

      这是乌迪的回复

      首先,客户端队列出现在服务器配置中是非常不寻常的。我建议删除它。

      其次,我假设您在手动初始化总线时没有使用通用主机 - 这很好,只是想检查一下。 此外,您是否对客户端和服务器端初始化使用相同的代码?这不是特别推荐的。 至少,服务器端应该是事务性的(除非你要走一些幂等的消息传递路线)。

      第三,如果您使用二进制序列化程序,您尝试做的事情应该可以正常工作。原因是假设更紧密的耦合并且不需要显式的消息契约。另一方面,XML Serializer 是为强制执行更明确的消息模式而构建的 - 因此不支持这些派生类型。

      您可能希望在消息中使用派生类型(查询、直接数据操作等)的场景通常是您一开始不应该使用消息传递的领域。

      希望在某种程度上有所帮助。

      -- 乌迪·达汉

      【讨论】:

        猜你喜欢
        • 2011-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-22
        • 1970-01-01
        • 1970-01-01
        • 2020-11-24
        相关资源
        最近更新 更多