Что определяет, является ли поле пользовательского типа CLR сериализуемым XML?

В качестве одного из моих первых проектов .NET я пытаюсь создать определяемый пользователем тип CLR для использования в SQL Server. В Требованиях для реализации UDT библиотеки MSDN говорится:

UDT должен реализовывать System.Xml.Serialization.IXmlSerializable, или все общедоступные поля и свойства должны относиться к типам, поддерживающим XML-сериализацию, или иметь атрибут XmlIgnore, если требуется переопределение стандартной сериализации.

Какое правило определяет, будут ли мои поля и свойства сериализуемыми в XML (используя стандартную сериализацию XML)? Какие типы требуют пользовательской сериализации XML?

Изменить: В конечном счете, я хочу знать, нужно ли мне реализовывать интерфейс IXmlSerializable. Похоже, у меня есть выбор: либо реализовать его, либо ограничиться членами класса/структуры, которые SQL Server CLR может обрабатывать автоматически.


person dlh    schedule 23.08.2011    source источник


Ответы (3)


Примитивные типы .Net, такие как string, DateTime, int, boolean и т. д., являются XmlSerializable, если свойство вашего пользовательского типа f.i. MyClass этого типа должен быть сериализуемым, отмеченным атрибутами сериализации

person Vladimir Dorokhov    schedule 23.08.2011
comment
пожалуйста, простите меня: я не понимаю, что вы написали. Вы имеете в виду, что члены с непримитивными типами автоматически сериализуются XML сервером SQL Server тогда и только тогда, когда они украшены определенным атрибутом? - person dlh; 24.08.2011

Любой тип считается XmlSerializable по умолчанию. Ничего особенного добавлять не нужно. Просто нужно соблюдать некоторые правила:

  1. Ваш тип должен определять конструктор по умолчанию.
  2. Вы не должны использовать определенный объект, который не может быть сериализован в XML (например, производные объекты IDictionary.
  3. Если вам нужно разместить свойства только для чтения или свойства типов, которые не поддерживаются сериализацией XML, вы должны пометить их атрибутами [XmlIgnore], чтобы они не были сериализованы.

Если вы хотите больше контролировать способ сериализации вашего класса (например, предоставить специальные имена для узлов, контролировать, сериализуются ли свойства ваших классов как узлы или атрибуты и т. д.), вам следует просмотреть эти атрибуты http://msdn.microsoft.com/en-us/library/83y7df3e.aspx

person Vladimir Perevalov    schedule 26.08.2011
comment
Не могли бы вы уточнить № 3: только ли объекты, производные от IDictionary, не сериализуемы в XML? Что касается № 4, в примерах пользовательского типа MSDN показаны свойства только для чтения без атрибута XmlIgnore (например, IsNull и Null в в этом примере). - person dlh; 27.08.2011
comment
Я точно знаю, что Hashtable и Dictionary‹› не могут найти точный список других типов, которые напрямую не поддерживаются. Но, если хотите, вы создаете собственный тип, который будет реализовывать IXmlSerializable. Затем XmlSerialzer будет использовать эту реализацию. Итак, если вы хотите сериализовать Dictionary, вы можете создать собственную реализацию, подобную этой: `public class SerializableDictionary‹TKey, TValue› : Dictionary‹TKey, TValue›, IXmlSerializable {/*Implement IXmlSerializable */}. Насчет полей только для чтения, возможно, я ошибся. - person Vladimir Perevalov; 28.08.2011

Из "Введение в XML-сериализацию":

Элементы, которые можно сериализовать

Следующие элементы можно сериализовать с помощью класса XmLSerializer:

  • Общедоступные свойства чтения/записи и поля общедоступных классов.

  • Классы, реализующие ICollection или IEnumerable.

    Примечание. Сериализуются только коллекции, а не общедоступные свойства.

  • Объекты XmlElement.

  • Объекты XmlNode.

  • Объекты набора данных.

person John Saunders    schedule 28.08.2011