Я пытаюсь написать код для десериализации файла 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>
Ваш код работает нормально. "В документе 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);
}
}