2017-02-21 4 views
0

Je reçois XML au format suivant:XML sérialiseur pas en mesure de Désérialise tableau correctement

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

Maintenant, quand je suis chaîne Deserializng orderxml contenant le XML, il ne remplit pas <OfferOrder> dans mon objet OrderData.

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

Classes:

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

quelque chose de mal avec mes cours?

+0

Simpelst façon est définie [cet article] (http://stackoverflow.com/questions/364253/how-to-deserialize-xml-document) –

Répondre

2

Il y a quelques problèmes dans votre code. D'abord, vous pouvez faire vos propriétés aux propriétés implémentées automatiquement, c'est omettre le soutien des champs privés et écrire ceci:

public MyType MyProperty { get; set; } 

Deuxièmement, vous devez fournir les noms des balises dans le Xml au sérialiseur. Dans votre cas, les noms dans le xml et ceux dans votre structure de classe sont égaux, donc vous pouvez omettre les noms aussi. Cependant, juste pour être complet:

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

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

La raison pour laquelle il doesnt travail pour vous est que les tableaux sont généralement sérialisés avec un élément imbriqué dont le nom dans votre cas serait OfferOrders. Dans cette balise, vous avez ensuite les éléments de tableaux. Habituellement, il n'est pas nécessaire d'avoir une nouvelle imbrication, ce que vous voulez à la place est d'aplatir les éléments du tableau directement dans votre classe de données réelle. Pour ce faire, ajoutez un XmlElement en avance de votre tableau-déclaration avec le nom des éléments , dans mon code OfferOrder.

+0

Je suspecte un autre problème découlant de "partial" ('public partial class OrderOrderData ') – Fildor

+0

@HimBromBeere' le type ou l'espace de nommage XmlElement n'a pas pu être trouvé' –

+0

Puis ajoutez-le: 'using System.Xml.Serialization;'. – HimBromBeere