如果我切换到使用数组而不是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序列化的结果是可读的(在检查错误队列时非常好)但它不支持所有类型或所有格式化选项.它做它做的事情并且做得很好.
也就是说,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 举报,一经查实,本站将立刻删除。