Сообщение, сериализованное с помощью XmlMessageFormater, отказывается десериализовать элемент List‹T›

У меня проблемы с сериализацией сообщений 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);
    }

Член lanesSelections класса типа System.Collections.Generic.List, где 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>  

I deserialize the message at the other end like so:

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, который, хотя он явно имеет значение в XML, оценивается как нулевой экземпляр в десериализованном сообщении.

В отчаянии я попытался добавить список в класс, заполнив его значениями 1-5 при построении. Если бы это было правильно сериализовано, это показало бы мне, что проблема связана с классом LaneSelection, но если нет, то проблема была бы с сериализацией списка. Список не был правильно сериализован.

Кто-нибудь знает, что происходит не так?


person RikSaunderson    schedule 07.02.2013    source источник
comment
Возможно, попробуйте украсить свой класс атрибутами XmlSerilizer — в частности, список с XmlArray (даже если это список!) msdn.microsoft.com/en-us/library/ ? Я знаю, что это работает с XmlSerilizer, но не уверен, как вы сериализуете.   -  person Jay    schedule 07.02.2013
comment
Пожалуйста, опубликуйте код для участника laneSelections.   -  person Mike the Tike    schedule 07.02.2013
comment
Вы читали stackoverflow .com/questions/1474505/ ?   -  person Paul Zahra    schedule 11.02.2013


Ответы (2)


две вещи;

  1. В объявлении IvtmMessage есть «laneSelections», но сериализованный XML — это «LaneSelections» с большой буквы L. Сериализация/десериализация XML чувствительна к регистру, и это ловило меня более одного раза.
  2. Пробовали ли вы добавить следующее в свойство LaneSelections класса IvtmMessage, как в приведенном ниже коде;

определение собственности;

 [XmlArray("LaneSelections"), XmlArrayElement("LaneSelection")]
 public List<LaneSelection> LaneSelections { get; set; }

Без надлежащих атрибутов Xml в свойствах и классах вы оставляете сериализатору интерпретацию того, как должны быть переведены свойства/объекты.

person DiskJunky    schedule 14.02.2013

Возможно, вам нужно добавить атрибут [XmlInclude(typeof(LaneSelection))] в ваш класс ProposalRequestMessage.

person user626528    schedule 12.02.2013