С# Невозможно десериализовать xml, чтобы вернуть общий список

Я пытаюсь загрузить список из файла xml. У меня есть разные списки моих пользовательских классов и разные файлы xml. План состоял в том, чтобы создать один метод, чтобы иметь возможность десериализовать их все следующим образом:

ListDependencies.Deserialize(DependenciesPath);
ListProfessions.Deserialize(ProfessionsPath);
ListCategories.Deserialize(CategoriesPath);
...

При десериализации я получаю сообщение об ошибке, что файл xml имеет непредвиденный формат.

    public static List<T> Deserialize<T>(this T value, string _path)
    {
        var xmlserializer = new XmlSerializer(typeof(List<T>));

        using (StreamReader sr = new StreamReader(_path, Encoding.Unicode))
        {
            using (var reader = XmlReader.Create(sr.BaseStream))
            {
                return (List<T>)xmlserializer.Deserialize(reader);
            }
        }
    }

Внутреннее исключение:

{"<ArrayOfDependencyObject xmlns=''> was not expected."} System.Exception {System.InvalidOperationException}

XmlContent:

<ArrayOfDependencyObject xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <DependencyObject>
    <Profession>80dd893e-9eb6-42c6-9b60-a61b87df0d1b</Profession>
    <Dependency>f76c72be-f2da-435b-b1f8-a4775c0bc1f1</Dependency>
  </DependencyObject>
  <DependencyObject>
    <Profession>8ab9b108-dd4b-4639-b323-c7a6c28f1314</Profession>
    <Dependency>9b86ff1d-c1de-4f95-adc8-413a94714cc0</Dependency>
  </DependencyObject>
  <DependencyObject>
    <Profession>5a273efa-eb29-4ea0-bd1d-2bb84727aa1e</Profession>
    <Dependency>954bd3d6-e78e-424e-bd69-8b46f239c5f2</Dependency>
  </DependencyObject>
</ArrayOfDependencyObject>

Может кто-нибудь помочь мне?


person Nico Mayer    schedule 08.01.2020    source источник
comment
Вы пытались добавить пространство имен в сериализатор? Как здесь для примера   -  person leo_acm94    schedule 08.01.2020
comment
Вы заметили, что не используете значение в своем методе расширения, за исключением, может быть, вывода типа? Вы передаете переменную ListDependencies, но ничего с ней не делаете.   -  person Holger    schedule 08.01.2020
comment
Отвечает ли это на ваш вопрос? Десериализация xml, включая пространство имен   -  person Jawad    schedule 08.01.2020
comment
@ leo_acm94 Я не знаю, какие заголовки добавить. Насколько я понял, эта статья была о десериализации xml с заголовками, которые человек не мог удалить.   -  person Nico Mayer    schedule 08.01.2020
comment
@Holger Это та часть, которую я тоже не совсем понимаю. Если я добавлю «это значение T», я могу вызвать этот метод из своего списка напрямую (ListDependencies.Deserialize(_path). Если я удалю его, я больше не смогу этого делать. Я почему-то подумал, что должно быть возможно получить тип списка Я вызываю метод из и соответствующим образом преобразую возвращаемое значение: ListDependencies.Deserialize() -> return List‹DependencyObject› ListCategories.Deserialize() -> return List‹CategoryObject› и т. д.   -  person Nico Mayer    schedule 08.01.2020


Ответы (1)


То, что я вижу из XML, это объект с массивом элементов. Измените метод Deserialize, как показано ниже, и повторите попытку.

public static T Deserialize<T>(this T value, string _path)
{
    var xmlserializer = new XmlSerializer(typeof(T));

    using (StreamReader sr = new StreamReader(_path, Encoding.Unicode))
    {
        using (var reader = XmlReader.Create(sr.BaseStream))
        {
            return (T)xmlserializer.Deserialize(reader);
        }
    }
}

Я пробовал этот метод с данным XML

var ListDependencies = new ArrayOfDependencyObject();
var results = ListDependencies.Deserialize(xmlFile);
foreach (var element in results.DependencyObject)
{
    Console.WriteLine($"{element.Profession}:{element.Dependency}");
}

и получил этот вывод

80dd893e-9eb6-42c6-9b60-a61b87df0d1b:f76c72be-f2da-435b-b1f8-a4775c0bc1f1
8ab9b108-dd4b-4639-b323-c7a6c28f1314:9b86ff1d-c1de-4f95-adc8-413a94714cc0
5a273efa-eb29-4ea0-bd1d-2bb84727aa1e:954bd3d6-e78e-424e-bd69-8b46f239c5f2
person Krishna Muppalla    schedule 08.01.2020
comment
Это работает намного лучше. Я настроил метод десериализации, как вы предложили, и могу получить список с помощью этого кода: var result = ListDependencies.Deserialize(DependenciesPath); ListDependencies = (List<DependencyObject>)result; Итак, сейчас лучший результат. Есть ли способ получить тип списка и выполнить приведение в методе Deserialize? - person Nico Mayer; 08.01.2020
comment
На самом деле это решение. Он также работает с `ListProfessions = ListProfessions.Deserialize(Path)'. Актерский состав не нужен. Так что спасибо тебе. - person Nico Mayer; 08.01.2020