Вопрос по .net, xml – Использование .Net, какие ограничения (если таковые имеются) существуют в использовании XmlSerializer?

8

Использование .Net, какие ограничения (если таковые имеются) существуют в использовании XmlSerializer? Например, вы можете сериализовать изображения в XML?

Перепишите, пожалуйста. Это не специфичный для C # вопрос. Пометьте тегом ".net" вместо. Alex Lyman

Ваш Ответ

7   ответов
0

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

3

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

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

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

Это занимает много времени при первом сериализации класса и требует кода с разрешениями для компиляции и записи на диск.

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

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

18

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

  1. It must know all the types being serialized. You cannot pass it something by interface that represents a type that the serializer does not know.
  2. It cannot do circular references.
  3. It will serializes the same object multiple times if referenced multiple times in the object graph.
  4. Cannot handle private field serialization.

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

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

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
1

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

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

2

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

Error: User Rate Limit Exceeded
22

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

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

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

  • Requires a public, no args constructor
  • Only serializes public read/write properties and fields
  • Requires all types to be known
  • Actually calls into get_* and set_*, so validation, etc. will be run. This may be good or bad (think about the order of the calls as well)
  • Will only serialize IEnumerable or ICollection collections conforming to specific rules

The XmlSerializer gives special treatment to classes that implement IEnumerable or ICollection. A class that implements IEnumerable must implement a public Add method that takes a single parameter. The Add method's parameter must be of the same type as is returned from the Current property on the value returned from GetEnumerator, or one of that type's bases.

A class that implements ICollection (such as CollectionBase) in addition to IEnumerable must have a public Item indexed property (indexer in C#) that takes an integer, and it must have a public Count property of type integer. The parameter to the Add method must be the same type as is returned from the Item property, or one of that type's bases. For classes that implement ICollection, values to be serialized are retrieved from the indexed Item property, not by calling GetEnumerator.

  • Does not serialize IDictionary
  • Uses dynamically generated assemblies, which may not get unloaded from the app domain.

To increase performance, the XML serialization infrastructure dynamically generates assemblies to serialize and deserialize specified types. The infrastructure finds and reuses those assemblies. This behavior occurs only when using the following constructors:

XmlSerializer.XmlSerializer(Type) XmlSerializer.XmlSerializer(Type, String)

If you use any of the other constructors, multiple versions of the same assembly are generated and never unloaded, which results in a memory leak and poor performance.

  • Cannot serialize ArrayList[] or List<T>[]
  • Has other weird edge cases

The XmlSerializer cannot be instantiated to serialize an enumeration if the following conditions are true: The enumeration is of type unsigned long (ulong in C#) and the enumeration contains any member with a value larger than 9,223,372,036,854,775,807.

The XmlSerializer class no longer serializes objects that are marked as [Obsolete].

You must have permission to write to the temporary directory (as defined by the TEMP environment variable) to deserialize an object.

  • Requires reading .InnerException to get any useful info on errors
Error: User Rate Limit Exceeded
1

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

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