2017-02-21 21 views
0

Я получаю XML в следующем формате:XML сериализатор не в состоянии Deserialize массив правильно

<Order> 
    <OrderData> 
     <OfferOrder></OfferOrder> 
     <OfferOrder></OfferOrder>  
    </OrderData> 
</Order> 

Теперь, когда я Deserializng строка orderxml, содержащая XML, он не заполняет <OfferOrder> в мой OrderData объект.

XmlSerializer xmlserializer = new XmlSerializer((typeof(Order))); 
using (TextReader reader = new StringReader(orderxml)) 
{ 
    order = (Order)xmlserializer.Deserialize(reader); 
} 

Классы:

public partial class Order 
{ 
    private OrderOrderData orderDataField; 

    public OrderOrderData OrderData 
    { 
     get 
     { 
      return this.orderDataField; 
     } 
     set 
     { 
      this.orderDataField = value; 
     } 
    } 
} 

public partial class OrderOrderData 
{ 
    private OrderOrderDataOfferOrder[] offerOrderField; 

    public OrderOrderDataOfferOrder[] OfferOrder 
    { 
     get 
     { 
      return this.offerOrderField; 
     } 
     set 
     { 
      this.offerOrderField = value; 
     } 
    } 
} 

Что-то не так с моими классами?

+0

Определяется путь Simpelst [этот пост] (http://stackoverflow.com/questions/364253/how-to-deserialize-xml-document) –

ответ

2

В коде есть некоторые проблемы. Во-первых вы можете сделать свои свойства авто Реализуемый свойств, то есть опустить частные бэк-поля и написать вместо этого:

public MyType MyProperty { get; set; } 

Во-вторых, вы должны предоставить имена тегов в Xml к сериализатором. В вашем случае имена внутри xml и те, что содержатся в вашей структуре классов, равны, поэтому вы также можете опустить имена. Однако, для полноты:

public class Order 
{ 
    [XmlElement("OrderData") 
    public OrderOrderData OrderData { get; set; } 
} 

public class OrderOrderData 
{ 
    [XmlElement("OfferOrder") 
    public OrderOrderDataOfferOrder[] OfferOrder { get; set; } 
} 

Причина, почему это не распространяется работа для вас является то, что массивы, как правило, сериализовать с вложенным элементом, имя которого в вашем случае будет OfferOrders. Внутри этого тега у вас есть элементы массивов. Обычно не нужно иметь такое дополнительное вложение, а вместо этого нужно сгладить элементы массива непосредственно в ваш фактический класс данных. Для этого добавьте XmlElement авансовую декларацию вашего массива с именем элементов, в моем коде OfferOrder.

+0

Я подозреваю, что возникла другая проблема, возникающая из-за «частичного» ('public partial class OrderOrderData ') – Fildor

+0

@HimBromBeere' тип или пространство имен XmlElement не удалось найти' –

+0

Затем добавьте его: 'using System.Xml.Serialization;'. – HimBromBeere