2015-12-18 1 views
1

je dois désérialiser le XML suivant reçu d'un fournisseurDataContractSerializer liste Deserialize ne fonctionne pas

<desc> 
    <l_error> 
     <error>Error 1</error> 
     <error>Error 2</error> 
    </l_error> 
</desc> 

Pour faire je j'utilise DataContractSerializer, j'ai défini les classes suivantes pour désérialiser

[CollectionDataContract(Name = "desc", Namespace = "")] 
public class DescriptionError : List<Error> 
{ 
} 

[DataContract(Name = "l_error", Namespace = "")] 
public class Error 
{ 
    [DataMember(Name = "error")] 
    public string Description { get; set; } 
} 

Et une méthode générique faire désérialiser

public static T Deserialize<T>(string text) 
{ 
    using (MemoryStream stream = text.ToStream()) 
    { 
     var serializer = new DataContractSerializer(typeof(T)); 
     return (T)serializer.ReadObject(stream); 
    } 
} 

Le problème est w Si je désérialise le XML ci-dessus, l'objet DescriptionError retourné ne contient qu'un seul élément, le premier "error 1", le second élément d'erreur du XML n'est pas dans DescriptionError. Je ne suis pas capable de comprendre ce que je fais de mal.

Merci.

Répondre

1

Habituellement, la meilleure façon de résoudre ce problème est de travailler l'inverse - créez vos objets et sérialisez-les pour voir ce que vous obtiendrez.

Si vous regardez ce que vous avez, vous avez quelque chose qui semble impliquer un seul élément desc avec plusieurs enfants l_error qui contiennent un seul error. Évidemment, cela ne correspond pas à ce que votre XML est.

C'est plus ce que vous voulez - un seul élément desc qui contient un élément l_error contenant plusieurs éléments de chaîne error.

[DataContract(Name = "desc", Namespace = "")] 
public class Desc 
{ 
    [DataMember(Name = "l_error")] 
    public LError LError { get; set; } 
} 

[CollectionDataContract(ItemName = "error", Namespace = "")] 
public class LError : List<string> 
{  
} 
+0

Cela fonctionne! Merci de votre aide. –

-1

Votre classe d'objet doit ressembler Vous pouvez utiliser http://xmltocsharp.azurewebsites.net/ pour obtenir C# classe de XML

using System; 
using System.Xml.Serialization; 
using System.Collections.Generic; 
namespace MyNamespace 
{ 
    [XmlRoot(ElementName="l_error")] 
    public class L_error { 
     [XmlElement(ElementName="error")] 
     public List<string> Error { get; set; } 
    } 

    [XmlRoot(ElementName="desc")] 
    public class Desc { 
     [XmlElement(ElementName="l_error")] 
     public L_error L_error { get; set; } 
    } 

} 

Vous avez mal public string Description { get; set; } qui devrait ressembler à public List<string> Description { get; set; }

+0

Ces attributs sont pour XmlSerializer, j'utilise DataContractSerializer pour désérialiser. –

+0

mais vous manquez toujours un 'List (Array)' pour les erreurs – Slasko

+0

Ce post est-il faux ou pourquoi -1? – Slasko