Я обычно нахожу XmlSerializer плохим выбором для любого POCO, который больше, чем просто DTO. Если вам требуется конкретный XML, вы можете пойти по пути Xml * Attribute и / или IXmlSerializable, но у вас останется довольно искаженный объект.
Для некоторых целей это все еще очевидный выбор - даже с учетом его ограничений. Но для простого хранения и перезагрузки данных я обнаружил, что BinaryFormatter - гораздо более простой выбор с меньшими ошибками.
Вот список некоторых неприятностей с XmlSerializer - большинство из которых меня укусили в тот или иной момент, другие я нашел на MSDN :
- Требуется публичный конструктор без аргументов
- Сериализует только общедоступные свойства и поля для чтения / записи
- Требуется знать все типы
- На самом деле вызовы get_ * и set_ *, поэтому проверка и т. Д. Будут выполнены. Это может быть хорошо или плохо (подумайте также о порядке звонков)
- Сериализует только коллекции IEnumerable или ICollection, соответствующие определенным правилам
XmlSerializer предоставляет особый режим для классов, которые реализуют IEnumerable или ICollection. Класс, реализующий IEnumerable, должен реализовывать открытый метод Add, который принимает один параметр. Параметр метода Add должен иметь тот же тип, который возвращается из свойства Current для значения, возвращаемого из GetEnumerator или одной из основ этого типа.
Класс, который реализует ICollection (например, CollectionBase) в дополнение к IEnumerable, должен иметь открытое индексированное свойство Item (indexer в C #), которое принимает целое число, и у него должно быть открытое свойство Count типа integer. Параметр метода Add должен быть того же типа, который возвращается из свойства Item или одной из основ этого типа. Для классов, которые реализуют ICollection, значения для сериализации извлекаются из индексированного свойства Item, а не путем вызова GetEnumerator.
- Не сериализует IDictionary
- Используются динамически генерируемые сборки, которые нельзя выгружать из домена приложения.
Для повышения производительности инфраструктура сериализации XML динамически генерирует сборки для сериализации и десериализации указанных типов. Инфраструктура находит и использует эти сборки. Это происходит только при использовании следующих конструкторов:
XmlSerializer.XmlSerializer (тип)
XmlSerializer.XmlSerializer (Type, String)
Если вы используете любой из других конструкторов, несколько версий одной и той же сборки генерируются и никогда не выгружаются, что приводит к утечке памяти и снижению производительности.
- Невозможно сериализовать ArrayList [] или List []
- Имеет другие странные крайние случаи
Не удается создать экземпляр XmlSerializer для сериализации перечисления, если выполняются следующие условия: перечисление имеет тип unsigned long (ulong в C #), и перечисление содержит любой член, значение которого больше 9,223,372,036,854,775,807.
Класс XmlSerializer больше не сериализует объекты, помеченные как [устаревшие].
У вас должно быть разрешение на запись во временный каталог (как определено переменной среды TEMP) для десериализации объекта.
- Требуется чтение .InnerException, чтобы получить любую полезную информацию об ошибках