NServiceBus允许控制反序列化?

时间:2012-03-05 18:03:50

标签: nservicebus deserialization

我正在尝试通过使用NServiceBus“包装器”从应用程序包装XML导出来将遗留应用程序与NServiceBus集成,该封装基本上剥离了命名空间并添加了包络和NSB命名空间。

我有基本的解决方案,但前提是XML导出的根元素与NServiceBus消息类型名称完全匹配。

例如,如果xml是:

<?xml version="1.0"?>
<Messages xmlns="http://tempuri.net/MyMessagesNamespace">
    <!-- Note: the "V1" -->
    <PolicyEndorsedV1>
        ...
    </PolicyEndorsedV1>
</Messages>

然后我的处理程序代码可以愉快地反序列化:

namespace MyMessagesNamespace
{
    public class PolicyEndorsedV1Handler : IHandleMessages<PolicyEndorsedV1>
    {
        public void Handle(PolicyEndorsedV1 message)
        {
            // All work fine!
            ...
        }
    }
}

但是,如果导出XML是

<?xml version="1.0"?>
<Messages xmlns="http://tempuri.net/MyMessagesNamespace">
    <!-- Note: the "V1" has been removed -->
    <PolicyEndorsed>
        ...
    </PolicyEndorsed>
</Messages>

这不会被反序列化。 NServiceBus告诉我 System.TypeLoadException:无法处理类型'Beazley.Messages.Risks.Events.PolicyEndorsed',这是可以理解的,因为它必须进行的唯一信息是根节点的名称传入的xml。

我试图通过在我的消息定义中添加一些.Net Serialization属性来控制反序列化行为:

[XmlRoot(ElementName = "PolicyEndorsed", Namespace = "", IsNullable = false)]
public partial class PolicyEndorsedV1
{
    ...
}

但是这被忽略了,因为NServiceBus使用它自己的序列化器(称为XmlMessageSerializer)而不是.Net自己的XmlSerializer。

所以有谁知道我怎么做到这一点?我认为可以选择将Xml名称与其NSB消息传递对应物分离。

非常感谢

1 个答案:

答案 0 :(得分:1)

PolicyEndorsedV1是否继承自PolicyEndorsed

如果是,请使用IHandleMessages<PolicyEndorsed>PolicyEndorsedV1Handler将处理这两种类型的对象。

例如:

public class PolicyEndorsedV1Handler : IHandleMessages<PolicyEndorsed>
{
    public void Handle(PolicyEndorsed message)
    {
        // Handles both PolicyEndorsed and PolicyEndorsedV1 messages
    }
}