2016-01-07 2 views
2

Имея некоторые проблемы с тем, чтобы мои классы десериализовали правильно.C# Deserialisation List Count Zero

Другие классы десериализации хорошо работают и кажутся похожими по своему характеру, но когда работает десериализатор, я получаю 0 счет для списков ErrorDetail и String.

Что я пропустил/сделал неправильно?

XML:

<PlaceOrderResponse 
    xmlns="http://blah.co.uk"> 
    <PlaceOrderResult 
     xmlns:a="http://blah.co.uk/WebserviceMessage" 
     xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
     <a:ErrorDetails 
      xmlns:b="http://blah.co.uk/Error"> 
      <b:ErrorDetail> 
       <b:Code>1fasd</b:Code> 
       <b:Message>Explain</b:Message> 
      </b:ErrorDetail> 
     </a:ErrorDetails> 
     <a:ID i:nil="true"/> 
     <a:InformationalMessages 
      xmlns:b="http://schemas.microsoft.com/2003/10/Serialization/Arrays"/> 
      <a:Status>1</a:Status> 
     </PlaceOrderResult> 
    </PlaceOrderResponse> 

C# Классы:

[Serializable()] 
    [XmlRoot(ElementName = "PlaceOrderResponse", Namespace = "http://blah.co.uk", IsNullable = false)] 
    [XmlType(AnonymousType = true, Namespace = "http://blah.co.uk")] 
    public class PlaceOrderResponse 
    { 
     [XmlElement(ElementName = "PlaceOrderResult")] 
     public PlaceOrderResult placeOrderResult { get; set; } 
    } 

    [XmlRoot(ElementName = "PlaceOrderResult")] 
    public class PlaceOrderResult : WebserviceMessage { } 

[XmlRoot(Namespace = "http://blah.co.uk/WebserviceMessage")] 
    [XmlType(AnonymousType = true)] 
    public class WebserviceMessage 
    { 
     [XmlArray("ErrorDetails")] 
     [XmlArrayItem("ErrorDetail", typeof(ErrorDetail))] 
     public ErrorDetails errorDetails { get; set; } 
     [XmlElement("ID")] 
     public string ID { get; set; } 
     [XmlArray("InformationMessages")] 
     [XmlArrayItem(typeof(String))] 
     public List<String> InformationMessages { get; set; } 
     [XmlElement("Status")] 
     public string Status { get; set; } 
    } 

[XmlRoot(ElementName = "ErrorDetails")] 
    [XmlTypeAttribute(AnonymousType = true)] 
    public class ErrorDetails : List<ErrorDetail> { } 

    [XmlRoot(ElementName = "ErrorDetail", Namespace = "http://blah.co.uk/Error")] 
    [XmlTypeAttribute(AnonymousType = true)] 
    public class ErrorDetail 
    { 
     [XmlElement(ElementName = "Code")] 
     public string Code { get; set; } 
     [XmlElement(ElementName = "Message")] 
     public string Message { get; set; } 
    } 

ответ

3

Ваш XmlArrayItem наследует свое пространство имен от своего родителя. Таким образом, вы должны явно включать в себя следующее:

[XmlArrayItem("ErrorDetail", typeof(ErrorDetail), Namespace = "http://blah.co.uk/Error")]. 

Что касается информационных сообщений, нет строки для загрузки, так что трудно сказать, что XML должен выглядеть. Ожидается, что элементы формы <string>message</string>

Как самый простой способ отладить эти проблемы - попробовать обратное - создать объект и сериализовать его в XML. Затем сравните его с тем, что вы пытаетесь deserlialize, и вам будет легко обнаружить, где различия.

+0

Да, спасибо! Я думаю, что у меня было это в какой-то момент, но что-то еще ввернуло, как я пытался исправить, я просто сделал это беспорядок, разместив здесь, прежде чем смутить себя дальше. – PurpleSmurph

0

Я не прошли через это вручную, но я могу только предположить, что ваш класс является неправильным в некотором роде. Используя класс ниже и ваш XML, я смог правильно десериализовать.

Я предполагаю, что вы пропустили заголовок своего XML для краткости?

<?xml version="1.0" encoding="utf-8"?> 

я дважды проверить и отредактировать пост в случае, если я ошибаюсь, но вы знаете, на .NET 4.5 и Visual Studio 2013 вы можете пойти в меню Edit> Paste Special> Paste XML как класс и имеют Визуальное Студия пишут класс для вас? Вот что я сделал.

Класс

/// <remarks/> 
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://blah.co.uk")] 
[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://blah.co.uk", IsNullable = false)] 
public partial class PlaceOrderResponse 
{ 

    private PlaceOrderResponsePlaceOrderResult placeOrderResultField; 

    /// <remarks/> 
    public PlaceOrderResponsePlaceOrderResult PlaceOrderResult 
    { 
     get 
     { 
      return this.placeOrderResultField; 
     } 
     set 
     { 
      this.placeOrderResultField = value; 
     } 
    } 
} 

/// <remarks/> 
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://blah.co.uk")] 
public partial class PlaceOrderResponsePlaceOrderResult 
{ 

    private ErrorDetails errorDetailsField; 

    private object idField; 

    private object informationalMessagesField; 

    private byte statusField; 

    /// <remarks/> 
    [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://blah.co.uk/WebserviceMessage")] 
    public ErrorDetails ErrorDetails 
    { 
     get 
     { 
      return this.errorDetailsField; 
     } 
     set 
     { 
      this.errorDetailsField = value; 
     } 
    } 

    /// <remarks/> 
    [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://blah.co.uk/WebserviceMessage", IsNullable = true)] 
    public object ID 
    { 
     get 
     { 
      return this.idField; 
     } 
     set 
     { 
      this.idField = value; 
     } 
    } 

    /// <remarks/> 
    [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://blah.co.uk/WebserviceMessage")] 
    public object InformationalMessages 
    { 
     get 
     { 
      return this.informationalMessagesField; 
     } 
     set 
     { 
      this.informationalMessagesField = value; 
     } 
    } 

    /// <remarks/> 
    [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://blah.co.uk/WebserviceMessage")] 
    public byte Status 
    { 
     get 
     { 
      return this.statusField; 
     } 
     set 
     { 
      this.statusField = value; 
     } 
    } 
} 

/// <remarks/> 
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://blah.co.uk/WebserviceMessage")] 
[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://blah.co.uk/WebserviceMessage", IsNullable = false)] 
public partial class ErrorDetails 
{ 

    private ErrorDetail errorDetailField; 

    /// <remarks/> 
    [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://blah.co.uk/Error")] 
    public ErrorDetail ErrorDetail 
    { 
     get 
     { 
      return this.errorDetailField; 
     } 
     set 
     { 
      this.errorDetailField = value; 
     } 
    } 
} 

/// <remarks/> 
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://blah.co.uk/Error")] 
[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://blah.co.uk/Error", IsNullable = false)] 
public partial class ErrorDetail 
{ 

    private string codeField; 

    private string messageField; 

    /// <remarks/> 
    public string Code 
    { 
     get 
     { 
      return this.codeField; 
     } 
     set 
     { 
      this.codeField = value; 
     } 
    } 

    /// <remarks/> 
    public string Message 
    { 
     get 
     { 
      return this.messageField; 
     } 
     set 
     { 
      this.messageField = value; 
     } 
    } 
} 
1

Ваши атрибуты XmlRoot не будут полезны ни в одном классе, кроме вашего корневого элемента PlaceOrderResponse. Вместо этого вам нужно добавить правильные пространства имен в свои атрибуты XmlArrayItem.

Например:

[XmlArray("ErrorDetails")] 
[XmlArrayItem("ErrorDetail", typeof(ErrorDetail), Namespace = "http://blah.co.uk/Error")] 
public ErrorDetails errorDetails { get; set; } 
0

Авось недостающее цитатой закончить строку URL-адрес в этой строке?

[XmlType(AnonymousType = true, Namespace = "http://blah.co.uk)] 
+0

Ах спасибо, просто орфографическая ошибка, пришлось скрыть некоторые пространства имен. – PurpleSmurph