MassTransit Xml反序列化含属性XML失败问题求助
解决MassTransit反序列化XML属性形式消息的问题
你当前的问题核心在于序列化器与特性不匹配:
- 你使用了MassTransit的XML序列化器,但实体类混用了Json.NET的
[JsonObject]/[JsonProperty]特性,XML属性的映射需要对应序列化器的特性支持。 - 直接添加
[XmlAttribute]无效,是因为当前序列化器未启用对该特性的识别,或是你用错了序列化器对应的特性体系。
两种可行解决方案
方案一:使用MassTransit内置RawXmlSerializer(基于System.Xml.Serialization)
如果不需要依赖Json.NET,直接用内置XML序列化器,实体类改用System.Xml.Serialization的特性:
using System.Xml.Serialization; // 指定XML根节点名称为event [XmlRoot("event")] public class WorkQueueOrderEvent { // 映射XML节点的wqid属性 [XmlAttribute("wqid")] public int WorkQueueId { get; set; } }
Bus配置时启用RawXmlSerializer:
var bus = Bus.Factory.CreateUsingActiveMq(cfg => { cfg.Host("activemq://localhost:61613"); // 使用内置原始XML序列化器 cfg.UseRawXmlSerializer(); // 其他队列/消费者配置... });
方案二:使用MassTransit.Newtonsoft的NewtonsoftXmlSerializer(基于Json.NET)
若需保留Json.NET特性支持,需配置序列化器识别System.Xml的特性:
实体类同时添加Json.NET和Xml序列化特性:
using Newtonsoft.Json; using System.Xml.Serialization; [JsonObject("event")] public class WorkQueueOrderEvent { [JsonProperty("wqid")] // 指定该属性对应XML的wqid属性 [XmlAttribute("wqid")] public int WorkQueueId { get; set; } }
Bus配置时启用NewtonsoftXmlSerializer并开启Xml特性支持:
var bus = Bus.Factory.CreateUsingActiveMq(cfg => { cfg.Host("activemq://localhost:61613"); // 使用Newtonsoft的XML序列化器,并配置识别Xml特性 cfg.UseNewtonsoftXmlSerializer(settings => { settings.XmlSerializerSettings.XmlAttributes = true; }); // 其他队列/消费者配置... });
关键说明
- 不要混用不同序列化体系的特性:Json.NET的
[JsonObject]/[JsonProperty]仅对Json.NET驱动的序列化器生效,System.Xml的[XmlRoot]/[XmlAttribute]仅对System.Xml驱动的序列化器生效。 - 确保序列化器与特性体系匹配,这是反序列化成功的核心。
内容的提问来源于stack exchange,提问作者Hawk IT
相关产品推荐
相关产品推荐

