Member 10192073 Ответов: 1

Ошибка десериализации Xml - ответа в C#


Привет, у меня есть один сервис веб-API, где я получаю XML-ответ, мой веб-API выглядит следующим образом

public Task<Dictionary<long, string>> GetXMLResponse() 
           {

            Dictionary<long, string> dic = new Dictionary<long, string>();
            dic.Add(1, "a");
            dic.Add(2, "b");

            return dic;
           }


Теперь я вызываю эту службу из своего оконного приложения следующим образом

HttpWebResponse response = (HttpWebResponse)request.GetResponse();

                    if (response != null)
                    {
                        using (var streamReader = new StreamReader(response.GetResponseStream()))
                        {
                           XmlSerializer obj = new XmlSerializer(typeof(List<MyClass>));
                            
                           List<MyClass> class1 = (List<MyClass>)obj.Deserialize(streamReader);
                            
                        }



Мой класс такой

public class MyClass
    {
        [XmlElement(ElementName = "Key")]
        public long Key { get; set; }
  
        [XmlElement(ElementName = "Value")]
        public string Value { get; set; }
    }


Но когда я собираюсь десериализовать его, то получаю ошибку типа

Цитата:
Существует ошибка в XML - документе (1, 2).

и внутреннее исключение-это
Цитата:
<arrayofkeyvalueoflongstring xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays"> не ожидалось.


Ответ на что я становлюсь похожим

<?xml version="1.0"?>

-<ArrayOfKeyValueOflongstring xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">


-<KeyValueOflongstring>

<Key>1</Key>

<Value>a</Value>

</KeyValueOflongstring>


-<KeyValueOflongstring>

<Key>2</Key>

<Value>b</Value>

</KeyValueOflongstring>

</ArrayOfKeyValueOflongstring>


Что я уже пробовал:

Сначала я попытался десериализоваться непосредственно в словарь, но у меня была ошибка, а затем я попытался создать этот класс.

Заранее спасибо, пожалуйста, не могли бы вы помочь мне десериализовать его, с помощью объекта json его легко десериализовать, но XML-ответ я застрял.

Пожалуйста, помогите мне.
заранее спасибо

F-ES Sitecore

Сделайте также GetXMLResponse return List<MyClass & gt;. Не все объекты (например, словарь) будут поддерживать сериализацию. Единственный способ гарантировать, что вы можете сериализовать вещи, - это убедиться, что они имеют атрибут [Serializable], или создать свои собственные классы, которые, как вы знаете, могут быть сериализованы.

Member 10192073

Привет, когда же я пытаюсь попасть в Json, а затем десериализоваться в словарь, то в этот раз он работает нормально, но я должен реализовать его с помощью Xml-ответа в моем проекте и модульном тестировании.

Когда ответ в Json в это время

using (var streamReader = new StreamReader(response.GetResponseStream()))
{
ВАР результат = что streamreader.ReadToEnd();
dic = JsonConvert.DeserializeObject<dictionary<long, string="">>(результат);
}

этих строк достаточно для десериализации строки json

1 Ответов

Рейтинг:
1

lmoelleb

Возможно, удастся заставить словарь действительно работать - как большинство опытных программистов, я бы не знал, потому что независимо от того, работает он или нет, я знаю, что его никогда не следует использовать. Словари-это детали реализации, а не то, что изначально может быть представлено в JSON или XML, поэтому вы никогда не сможете доверять тому, как он сериализуется.

Как было предложено, измените контроллер, чтобы вернуть IEnumerable<string>.
Что-то вроде:

public IEnumerable<MyClass> GetXMLResponse() 
{
    // Just keeping your dictionary here to demonstrate the backend can still
    // work with a dictionary if this is the implementation making most sense
    Dictionary<long, string> dic = new Dictionary<long, string>();
    dic.Add(1, "a");
    dic.Add(2, "b");
    return dic.Select(entry => new MyClass { Key = entry.Key, Value = entry.Value});
}


В клиенте вы можете снова преобразовать свой enumerable of MyClass в словарь, выполнив что-то вроде:
myclassList.ToDictionary(entry => entry.Key, entry => entry.Value);