微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

xml-serialization – 具有IEnumerable属性的消息的NServiceBus Xml序列化问题

我正在尝试发送带有IEnumerable属性的消息,我是否认为NServiceBus Xml序列化程序不支持这个?
如果我切换到使用数组而不是IEnumerable它将工作,如果我使用二进制序列化器它也可以工作

我的消息看起来像这样

[Serializable]
public class Parent : IMessage
{
  public string Identifier { get; private set; }
  public IEnumerable<Child> Children { get; private set; }

  public Parent(string identifier,IEnumerable<Child> children)
  {
    this.Identifier = identifier;
    this.Children = children;
  }
}

[Serializable]
public class Child
{
  public string Identifier { get; private set; }
}

如果认的Xml序列化程序无法满足此要求,有没有办法配置替代的Xml序列化程序,如BCL的DataContractSerializer?

提前致谢

解决方法

首先,请注意NServiceBus中的XML序列化与.NET XML序列化不同. .NET变体的全部内容是能够使用属性定制结果XML以生成特定的XML模式,这可能与其他语言的互操作性. NServiceBus XML序列化程序是一个极小的功能子集,专门用于尽可能高效地将预定义的消息模式传输到XML或从XML传输.

虽然NServiceBus序列化的结果是可读的(在检查错误队列时非常好)但它不支持所有类型或所有格式化选项.它做它做的事情并且做得很好.

也就是说,IEnumerable的问题在于它可能有很多东西.实际上,它可能只是一个数组,但它可以很容易地成为一个复杂的Linq-to-sql表达式,它将调用数据库查询.为了序列化IEnumerable,您必须将其表示为集合(列表或数组),因此您必须枚举项目.你什么时候会这样做?交易可能带来哪些问题?这就是性能敏感的NServiceBus XML序列化程序不会打扰的原因.

NServiceBus消息只是传递消息数据的合同.我建议只使用一个数组.将IEnumerable转换为数组(使用ToArray()扩展方法)并返回(使用AsEnumerable()扩展方法)很容易,那么为什么将它作为IEnumerable重要呢?

要完全回答你的问题,应该可以通过编写自己的实现IMessageSerializer的类并配置依赖注入框架来使用它来交换序列化程序,但我自己没有尝试过.这将是一项艰巨的任务,因为每个端点都必须使用相同的串行器,并且您还必须进行修改才能使用分发器,TimeoutManager,Gateway等.

编辑:注意到这个问题在http://tech.groups.yahoo.com/group/nservicebus/message/8838在NSB集团上交叉发布

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。