XML DataContractDeserialization Требуется ПОМОЩЬ - PullRequest
3 голосов
/ 30 декабря 2011

У меня есть следующий XML:

<?xml version="1.0" ?>
<Responses>
    <ResponseList>
      <Response type="XXX">
        <Foo>YYYY</Foo>
        <Bar>ZZZZ</Bar>
      </Response>
    </ResponseList>
</Responses>

как должны выглядеть мои классы, чтобы я мог десериализовать строку в объект (я использую DataContractSerializer)

[DataContract(Namespace = "")]
[Serializable]
public class Responses : DataContainer
{
    [DataMember]
    public ResponseCollection ResponseList { get; set; }
}

[Serializable]
public class Response : DataContainer 
{
    [DataMember]
    public string Foo { get; set; }
    [DataMember]
    public string Bar { get; set; }
}

[Serializable]
public class ResponseCollection : List<Response>
{
}

[править] Я действительно смог заставить его работать с DataContractSerializer .... Моя цель состояла в том, чтобы использовать DataContractSerializer для десериализации строки XML (ответа) в объект, и я получал NULL для обоих свойств (foo &бар).

[Serializable]
[DataContract(Namespace = "")]
public class Responses : DataContainer
{
    [DataMember(Name = "ResponseList")]
    public Response[] Response { get; set; }
}

[Serializable]
[DataContract(Namespace = "")]
public class Response : DataContainer
{
    [DataMember(Order = 0)]
    public string Foo { get; set; }
    [DataMember(Order = 1)]
    public string Bar { get; set; }
}

1 Ответ

2 голосов
/ 30 декабря 2011

(этот ответ предшествует редактированию, в котором разъясняется, что DataContractSerializer желателен)

Если я правильно понимаю пример, то, как показано ниже.Примечание: другие атрибуты не наносят вреда, но не используются XmlSerializer - я только показал те, которые используются XmlSerializer.

[XmlRoot("Responses")]
public class TxTNotifyResponse : DataContainer
{
    [XmlArray("ResponseList")]
    [XmlArrayItem("Response")]
    public MsgResponseCollection MsgResponseList { get; set; }
}

public class MsgResponse : DataContainer 
{
    [XmlElement("Foo")]
    public string Status { get; set; }
    [XmlElement("Bar")]
    public string MessageId { get; set; }
}

public class MsgResponseCollection : List<MsgResponse>
{
}

Если это не работает (и я не проверял это), попробуйте использовать отдельную модель DTO.Самый простой способ - поместить данные в XML-файл (скажем, your.xml) и использовать (в командной строке):

xsd.exe your.xml
xsd.exe your.xsd /classes

, который будет записывать your.cs

...