Чтобы система была надежной в любом случае, вам необходимо указать пространство имен вашего XML (вы всегда должны быть пространством имен XML в любом случае - но я спасу вас напыщенную речь).Поэтому:
<car xmlns="http://schemas.cars.org/car" brand="Hummer">
<type /> <chassis />
</car>
<shark xmlns="http://schemas.ocenia.org/predator">
<lazer-beams>1</lazer-beams>
<awesome>Hell yeah.</awesome>
</shark>
Тогда ваши атрибуты сериализации в C # XML станут такими:
[XmlRoot("Car", Namespace=CarNamespaceUri)]
public class Car
{
public const string CarNamespaceUri = "http://schemas.cars.org/car";
// ...
}
После этого вы напишите что-то вроде XmlSerializerManager
.Это позволит сохранить внутренний Dictionary<Tuple<string, string>, XmlSerializer>
- который можно заполнить с помощью отражения (ищите все типы с примененным XmlRootAttribute
и создайте кортеж в соответствии с Namespace, LocalName
и создайте экземпляр XmlSerializer
для этого типа).Вероятно, это будет статический класс.
Чтобы десериализовать любой элемент, вам просто нужно найти его имя и пространство имен в словаре, чтобы получить экземпляр XmlSerializer
.Например:
public static T Deserialize<T>(XElement element)
{
return (T)Deserialize(element);
}
public static object Deserialize(XElement element)
{
// Remember to do more elaborate checks etc.
using(var r = element.CreateReader())
{
return _serializers[Tuple.Create(element.Name.NamespaceName, element.Name.LocalName)].Deserialize(r);
}
}