2017-02-21 1 views
0

ich in folgendem Format XML bekommen:XML Serializer nicht in der Lage Array Deserialize richtig

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

Wenn ich jetzt Deserializng Zeichenfolge bin orderxml die XML enthält, ist es nicht <OfferOrder> in mein OrderData Objekt zu füllen.

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

Klassen:

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; 
     } 
    } 
} 

Ist etwas falsch mit meinen Klassen?

+0

Simpelst Weg ist definiert [this post] (http://stackoverflow.com/questions/364253/how-to-deserialize-xml-document) –

Antwort

2

Es gibt einige Probleme in Ihrem Code. Zuerst Sie Ihre Eigenschaften automatisch implementierte Eigenschaften machen kann, ist, dass die privaten Träger-Felder weglassen und schreiben Sie stattdessen:

public MyType MyProperty { get; set; } 

Zweite Sie die Namen der Tags in der XML-Serializer zu bieten haben. In Ihrem Fall sind die Namen in der XML und die in Ihrer Klassenstruktur gleich, Sie können also auch die Namen weglassen. Doch nur der Vollständigkeit halber:

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

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

Der Grund, warum es Arbeit spielt keine für Sie ist, dass Arrays in der Regel mit einem verschachtelten Element, dessen Name in Ihrem Fall serialisiert werden würde OfferOrders. Innerhalb dieses Tags haben Sie dann die Array-Elemente. Gewöhnlich ist es nicht erwünscht, diese weitere Verschachtelung zu haben, stattdessen möchten Sie die Elemente des Arrays direkt in Ihre eigentliche Datenklasse reduzieren. Fügen Sie hierzu eine XmlElement Ihrer Array-Deklaration mit dem Namen der Elemente, in meinem Code OfferOrder.

+0

Ich vermute ein weiteres Problem von "teilweise" ("öffentliche Teilklasse OrderOrderData ') – Fildor

+0

@HimBromBeere' der Typ oder Namespace XmlElement konnte nicht gefunden werden ' –

+0

Dann fügen Sie es hinzu: 'using System.Xml.Serialization;'. – HimBromBeere