Используя .NET, какие ограничения (если таковые имеются) находятся там в использовании XmlSerializer?

Вы можете разбить ключ на . перед доступом к ним на объекте

var keys = argv[2].split('.');
var result = obj;
keys.forEach(function(key){
    result = result[key]
});
return result;
8
задан skolima 25 November 2008 в 23:52
поделиться

8 ответов

XmlSerializer имеет несколько недостатков.

  1. Это должно знать все сериализируемые типы. Вы не можете передать его что-то интерфейсом, который представляет тип, который не знает сериализатор.
  2. Это не может сделать циклических ссылок.
  3. Это будет сериализировать тот же объект многократно, если ссылается многократно в графе объектов.
  4. Не может обработать частную полевую сериализацию.

Я (глупо) записал свой собственный сериализатор для обхождения некоторых из этих проблем. Не делайте этого; это - большая работа, и Вы найдете тонкие ошибки в нем месяцами в будущем. Единственной вещью я получил в письменной форме свой собственный сериализатор и средство форматирования, была большая оценка minutia, вовлеченного в сериализацию графа объектов.

Я нашел NetDataContractSerializer, когда WCF вышел. Это делает весь материал от вышеупомянутого, который не делает XmlSerializer. Это управляет сериализацией подобным способом к XmlSerializer. Каждый украшает различные свойства или поля с атрибутами для информирования сериализатора, что сериализировать. Я заменил пользовательский сериализатор, который я записал с NetDataContractSerializer и был очень доволен результатами.Очень рекомендую.

18
ответ дан 3 November 2019 в 12:16
поделиться

Я обычно нахожу, что XmlSerializer плохой выбор для любого ПОСТЕПЕННО, что это - больше, чем просто DTO. При требовании определенного XML можно пойти путем Xml*Attribute и/или IXmlSerializable - но Вас оставляют с объектом, довольно искаженным.

В некоторых целях это все еще очевидный выбор - даже с он - ограничения. Но, для того, чтобы просто сохранить и перезагрузить данные, я нашел, что BinaryFormatter намного более легкий выбор с меньшим количеством ловушек.

Вот список некоторых раздражений с XmlSerializer - большинство я был укушен однажды или другой, другие, которых я нашел в MSDN:

  • Требует общественности, никакого args конструктора
  • Только сериализирует общедоступные свойства чтения/записи и поля
  • Требует, чтобы все типы были известны
  • На самом деле вызовы в get_* и set_ *, таким образом, проверка, и т.д. будет выполнен. Это может быть хорошо или плохо (думайте о порядке вызовов также),
  • Только сериализирует IEnumerable или наборы ICollection, соответствующие определенным правилам

XmlSerializer дает специальный режим классам, которые реализуют IEnumerable или ICollection. Класс, который реализует IEnumerable, должен реализовать общественность, Добавляет метод, который берет единственный параметр. Параметр Добавить метода должен иметь тот же тип, как возвращается из свойства Current на значении, возвращенном из GetEnumerator или одного из оснований того типа.

Класс, который реализует ICollection (такой как CollectionBase) в дополнение к IEnumerable, должен иметь общедоступное индексируемое свойство Объекта (индексатор в C#), который берет целое число, и это должно иметь общедоступное свойство Count целого числа типа. Параметр к Добавить методу должен быть тем же типом, как возвращается из свойства Item или одного из оснований того типа. Для классов, которые реализуют ICollection, значения, которые будут сериализированы, получены от индексируемого свойства Item, не путем вызова GetEnumerator.

  • Не сериализирует IDictionary
  • Использование динамично генерировало блоки, которые не могут быть разгружены от домена приложения.

Для увеличения производительности инфраструктура сериализации XML динамично генерирует блоки, чтобы сериализировать и десериализовать указанные типы. Инфраструктура находит и снова использует те блоки. Это поведение происходит только при использовании следующих конструкторов:

XmlSerializer. XmlSerializer (тип) XmlSerializer. XmlSerializer (тип, строка)

При использовании какого-либо из других конструкторов несколько версий того же блока сгенерированы и никогда не разгружаются, который приводит к утечке памяти и низкой производительности.

  • Не может сериализировать ArrayList [] или Список <T> []
  • Имеет другие странные пограничные случаи

XmlSerializer нельзя инстанцировать для сериализации перечисления, если следующие условия верны: перечисление имеет тип, неподписанный долго (ulong в C#), и перечисление содержит любого участника со значением, больше, чем 9,223,372,036,854,775,807.

Класс XmlSerializer больше не сериализирует объекты, которые отмечены как [Устаревшие].

У Вас должно быть разрешение записать во временный каталог (как определено ВРЕМЕННОЙ переменной среды) для десериализации объекта.

  • Требует, чтобы чтение.InnerException получило любую полезную информацию об ошибках
22
ответ дан 3 November 2019 в 12:16
поделиться

Другая проблема состоит в том, что вызов конструктора XmlSerializer скомпилирует код во времени выполнения и генерирует временный DLL (в %temp папке %) с кодом, чтобы сделать de/serialization.

Можно смотреть код, если Вы добавляете следующие строки к app.config:

  <system.diagnostics>
    <switches>
      <add name="XmlSerialization.Compilation" value="4"/>
    </switches>
  </system.diagnostics>

Это занимает много времени в первый раз, когда Вы сериализируете класс и код потребностей с полномочиями для компиляции и записи в диск.

Способ двигаться, который должен предварительно скомпилировать эти DLL с помощью инструмента sGen.exe, который идет с VS 2005 +.

Посмотрите здесь для получения дополнительной информации.

3
ответ дан 3 November 2019 в 12:16
поделиться

Не уверенный, если существует какое-либо ограничение.. Но была ошибка утечки памяти в XmlSerialization в.NET 1.1, Вы сортируете, должен был создать объект сериализатора кэша двигаться с этой проблемой... На самом деле я не уверен, была ли эта проблема устранена в .net 2.0 или более новая...

2
ответ дан 3 November 2019 в 12:16
поделиться

Любой класс, который Вы пишете, может теоретически питаться через XmlSerializer. Howerver, это только имеет доступ к общедоступным полям, и классы должны быть отмечены с корректными атрибутами (например, XmlAttribute). Даже в основной платформе, не все поддерживает XmlSerializer. Система. Наборы. Универсальный. Словарь <>, например.

1
ответ дан 3 November 2019 в 12:16
поделиться

Одно ограничение, о котором я могу думать, - то, что XmlSerialization является уклонением; значение любых свойств класса, который Вы не хотите сериализированный, ДОЛЖНО быть украшено [XmlIgnore]. Контраст, которые к DataContractSerializer, где все свойства, подписываются, необходимо явно объявить атрибуты включения. Вот хорошая рецензия.

Изображения или их двоичные массивы сериализируются как base64 закодированный текст XmlSerializer.

1
ответ дан 3 November 2019 в 12:16
поделиться

Например, Вы не можете сериализировать классы, реализовав интерфейс IDictionary.

1
ответ дан 3 November 2019 в 12:16
поделиться

Для наборов у них должен быть Добавить метод, берущий отдельный аргумент. Если Вам просто нужен текстовый формат, и не конкретно xml Вы мог бы попробовать JSON. Я разработал один для.NET, JsonExSerializer, и существуют другие, доступные также по http://www.json.org.

0
ответ дан 3 November 2019 в 12:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: