2015-12-18 2 views
1

я должен десериализации следующий XML получил от поставщикасписок DataContractSerializer Deserialize не работает

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

Для ввода я использую DataContractSerializer, я определил следующие классы для десериализации это

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

И общий метод сделать десериализации

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

проблема заключается в том ш Купим вышеописанный XML, возвращаемый объект DescriptionError содержит только один элемент, первую «ошибку 1», второй элемент ошибки в XML не находится в DescriptionError. Я не могу понять, что я делаю неправильно.

Спасибо.

ответ

1

Обычно лучший способ решить это работать наоборот - создайте свои объекты и сериализуйте их, чтобы увидеть, какой XML вы получите.

Если вы посмотрите на то, что у вас есть, у вас есть что-то похожее на один элемент desc с несколькими детьми l_error, которые содержат один error. Очевидно, это не соответствует вашему XML.

Это больше того, что вы хотите - один элемент desc, содержащий элемент l_error, содержащий несколько элементов строки 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

Он работает! Спасибо за вашу помощь. –

-1

Ваш класс объект должен выглядеть как Вы можете использовать http://xmltocsharp.azurewebsites.net/, чтобы получить C# класс от 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; } 
    } 

} 

Вы неправильно public string Description { get; set; }, который должен выглядеть public List<string> Description { get; set; }

+0

Эти атрибуты для XmlSerializer, я использую DataContractSerializer для десериализации. –

+0

, но вы по-прежнему не указали 'List (Array)' для ошибок – Slasko

+0

Является ли это сообщение неправильным или почему -1? – Slasko

Смежные вопросы