Ошибка при десериализации

1

Я пытаюсь написать код для десериализации файла XML. Я немного оглянулся и нашел что-то, что привело меня к следующему методу:

    public static void Deserialize(string filePath)
    {
        RootObject ro = null;
        string path = filePath;

        XmlSerializer serializer = new XmlSerializer(typeof(RootObject));

        StreamReader reader = new StreamReader(path);
        ro = (RootObject) serializer.Deserialize(reader);
        reader.Close();
    }

Но все, что я получаю, это ошибка, и я не уверен, что ее вызывает:

В документе XML есть ошибка (2, 2).

RootObject, который вы видите в Deserialize(), является следующим: я новичок в сериализации/десериализации XMl, поэтому не уверен, правильно ли я определил его на 100%.

    public class RootObject
    {
        public Services Services { get; set; }
    }

    public class Services
    {
        public Service TileMapService { get; set; }
    }

    public class Service
    {
        public string Title { get; set; }
        public string href { get; set; }
    }

Я использую этот метод для создания файлов XML в первую очередь и, похоже, работает нормально:

    public static void WriteToXmlFile<T>(string filePath, T objectToWrite) where T : new()
    {
        TextWriter writer = null;
        try
        {
            var serializer = new XmlSerializer(typeof (T));
            writer = new StreamWriter(filePath);
            serializer.Serialize(writer, objectToWrite);
        }
        finally
        {
            if (writer != null)
            {
                writer.Close();
            }
        }
    }

Он получает XML файл, который выглядит так:

<RootObject xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Services>
    <TileMapService>
      <Title>Some title</Title>
      <href>http://something</href>
    </TileMapService>
  </Services>
</RootObject>
  • 1
    Как вы используете методы «WriteToXmlFile» и «Deserialize»? Я пробовал код и работает отлично.
  • 0
    Часто существует внутреннее исключение, которое говорит вам более подробно о том, что пошло не так.
Показать ещё 1 комментарий
Теги:

1 ответ

2
Лучший ответ

Ваш код работает нормально. "В документе XML есть ошибка (2, 2)". может быть потому, что ваш фактический файл (а не тот, который был создан WriteToXmlFile<T>) имеет пробел в начале или использует неправильное пространство имен. Проверьте .InnerException для более подробной информации или (возможно, проще), разместите фактическое содержимое файла xml. Пример его работы (наряду с некоторыми рекомендованными настройками для двух ключевых методов):

static void Main()
{
    RootObject obj = new RootObject
    {
        Services = new Services
        {
            TileMapService = new Service
            {
                Title = "abc",
                href = "def"
            }
        }
    };
    WriteToXmlFile("foo.xml", obj);
    var loaded = Deserialize<RootObject>("foo.xml");
    var svc = loaded.Services.TileMapService;
    System.Console.WriteLine(svc.Title); // abc
    System.Console.WriteLine(svc.href); // def
}
public static void WriteToXmlFile<T>(string filePath, T objectToWrite)
{       
    var serializer = new XmlSerializer(typeof(T));
    using (var writer = new StreamWriter(filePath))
    {
        serializer.Serialize(writer, objectToWrite);
    }
}
public static T Deserialize<T>(string filePath)
{
    var serializer = new XmlSerializer(typeof(T));
    using (var reader = new StreamReader(filePath))
    {
        return (T)serializer.Deserialize(reader);
    }
}
  • 0
    Да, я также узнал, что это прекрасно работает. Я просто вызывал метод не в том месте, которое как-то вызвало ошибку. Ваши настройки также имеют большой смысл. Спасибо за это.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню