c# - 使用 XmlMessageFormater 序列化的消息拒绝反序列化 List<T> 成员

标签 c# deserialization msmq xml-deserialization

我对 C# 消息序列化感到沮丧。
我有一个类,它有一个构造函数,如下所示:

public ProposalRequestMessage(int imaNumber, int proposalId, bool trainingFlag, string firstSiteAddress,
                                  bool lastSiteFlag, string lastSiteAddress, int reasonCode,
                                  List<LaneSelection> theLaneSelections)
    {
        ImaNumber = imaNumber;
        ProposalId = proposalId;
        TrainingFlag = trainingFlag;
        FirstSiteAddress = firstSiteAddress;
        LastSiteFlag = lastSiteFlag;
        LastSiteAddress = lastSiteAddress;
        ReasonCode = reasonCode;
        laneSelections = new List<LaneSelection>(theLaneSelections);
    }

System.Collections.Generic.List 类的 lanesSelections 成员,其中 LaneSelection 如下所示:

public class LaneSelection
{
    public int LaneId { get; set; }
    public SignalAspect AspectCode { get; set; }

    public LaneSelection()
    {
    }
    public LaneSelection(int laneId, SignalAspect aspectCode)
    {
        LaneId = laneId;
        AspectCode = aspectCode;
    }
}  

SignalAspect 是一个枚举。

我通过 MSMQ 发送包含此类实例的消息,如下所示:

System.Messaging.MessageQueue queue = new System.Messaging.MessageQueue(queuename);
        queue.Purge();

System.Messaging.Message msg = new System.Messaging.Message(theMessage, new System.Messaging.XmlMessageFormatter());
        queue.Send(msg);

使用一些调试工具,我发现生成的 XML 看起来有点像这样:

<?xml version="1.0"?>
<IvtmMessage xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">  
<MessageType>ProposalRequest</MessageType>  
<ProposalRequestMessage>    
    <ImaNumber>0</ImaNumber>    
    <ProposalId>2</ProposalId>    
    <TrainingFlag>false</TrainingFlag>    
    <FirstSiteAddress>M25/4690A</FirstSiteAddress>    
    <LastSiteFlag>false</LastSiteFlag>    
    <LastSiteAddress />    
    <ReasonCode>3</ReasonCode>    
    <LaneSelections>      
        <LaneSelection>        
            <LaneId>1</LaneId>        
            <AspectCode>Advisory20</AspectCode>      
        </LaneSelection>    
    </LaneSelections>  
</ProposalRequestMessage>  

我像这样在另一端反序列化消息:

Queue = new System.Messaging.MessageQueue(queueName);
Queue.Formatter = new System.Messaging.XmlMessageFormatter(new Type[] { typeof(IvtmMessage) });
Queue.ReceiveCompleted += new System.Messaging.ReceiveCompletedEventHandler(Queue_ReceiveCompleted);
Queue.BeginReceive(new System.TimeSpan(0, 0, 0, 30));
...
System.Messaging.MessageQueue mq = (System.Messaging.MessageQueue)sender;
try
{    
     // End the asynchronous Receive operation.
     System.Messaging.Message m = mq.EndReceive(e.AsyncResult);

     IvtmMessage message = (IvtmMessage)m.Body;
     DecodeMessage(message);
}
catch (System.Messaging.MessageQueueException ex)
{
     string exception = ex.Message;
}
mq.BeginReceive();

return; 

除 laneSelections 元素外,该类的每个成员都已正确反序列化,尽管 laneSelections 元素在 XML 中显然具有值,但在反序列化消息中评估为 null 实例。

在分离过程中,我尝试向类中添加一个列表,并在构造时用值 1-5 填充它。如果这个序列化正确,那么它会告诉我问题出在 LaneSelection 类上,但如果没有,那么问题就出在序列化一个 List 上。列表未正确序列化。

有人知道怎么回事吗?

最佳答案

可能您需要将 [XmlInclude(typeof(LaneSelection))] 属性添加到您的 ProposalRequestMessage 类。

关于c# - 使用 XmlMessageFormater 序列化的消息拒绝反序列化 List<T> 成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14753791/

相关文章:

c# - 使用自定义转换器从流中反序列化 Json

c# - 如何让我的 Java 应用程序与控制台 C# 应用程序交互?

c# - MSMQ - 发送到远程专用队列不执行任何操作

c# - 号码分布

c# - 是否可以将条件 LINQ 查询组合成每次都运行的查询?

c# - WPF 样式的 DataTrigger 绑定(bind)

java - 在自定义 java 类中反序列化 MapWritable

java - 反序列化空值以使用 Jackson 进行枚举

c# - 使用 ffmpeg 在特定时间向 wav 文件添加静音

wcf - 是否有使用 MSMQ 的简单 WCF 在线示例?