Самый простой способ диагностики проблем десериализации XML - это сериализация в XML и сравнение наблюдаемого XML с требуемым XML. Обычно проблема будет сразу очевидна.
Если я создаю и сериализую экземпляр VideoGames
следующим образом:
var root = new VideoGames
{
Types = new []
{
new GameType
{
Name = "RPG",
Code = new []
{
new Code { Text = "TestingData" },
}
},
},
Platform = new Platform { Compressed = 3.2876m, },
};
var xml = root.GetXml(omitStandardNamespaces: true);
Console.WriteLine(xml);
Используя следующий метод расширения:
public static string GetXml<T>(this T obj, XmlSerializer serializer = null, bool omitStandardNamespaces = false)
{
XmlSerializerNamespaces ns = null;
if (omitStandardNamespaces)
{
ns = new XmlSerializerNamespaces();
ns.Add("", ""); // Disable the xmlns:xsi and xmlns:xsd lines.
}
using (var textWriter = new StringWriter())
{
var settings = new XmlWriterSettings() { Indent = true }; // For cosmetic purposes.
using (var xmlWriter = XmlWriter.Create(textWriter, settings))
(serializer ?? new XmlSerializer(obj.GetType())).Serialize(xmlWriter, obj, ns);
return textWriter.ToString();
}
}
Тогда вывод:
<VideoGames>
<Types xmlns="http://www.specifiedcompany.com/API">
<Data Name="RPG">
<Code>
<Category Text="TestingData" />
</Code>
</Data>
</Types>
<Platform Compressed="3.2876" xmlns="http://www.specifiedcompany.com/API" />
</VideoGames>
Демонстрационная скрипка здесь .
Как видите, дочерние элементы <Types>
и <Platform>
все сериализуются в XML-пространстве имен , в частности http://www.specifiedcompany.com/API
.
Ваша десериализация завершается неудачно, потому что в примере XML эти элементы не находятся ни в каком пространстве имен.
Почему это происходит? Это потому, что все ваши классы, включая VideoGames
, имеют атрибут XmlTypeAttribute
, который задает Namespace
:
[System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://www.specifiedcompany.com/API")]
public partial class VideoGames
{
}
Этот атрибут указывает, что по умолчанию все свойства типа должны быть сериализованы в указанное пространство имен . (Сравните с XmlRootAttribute
, который указывает, как должен быть сериализован сам корневой элемент <VideoGames>
, а не только его дочерние элементы.)
Если вы не хотите этого, удалите настройку XmlTypeAttribute.Namespace
из ваших классов c # VideoGames
, Platform
, GameType
и Code
(демо-скрипта # 2 здесь ). Если вы этого хотите, измените ваш XML, включив в него необходимое пространство имен, как показано в выходном XML в этом ответе.