Правильный способ реализации IXmlSerializable?

На основании ответа @ chris-dolphin, но используя вспомогательную функцию:

// Creates svg element, returned as jQuery object
function $s(elem) {
  return $(document.createElementNS('http://www.w3.org/2000/svg', elem));
}

var $svg = $s("svg");
var $circle = $s("circle").attr({...});
$svg.append($circle);
146
задан Greg 2 February 2017 в 00:17
поделиться

3 ответа

Да, GetSchema () должен возвратить пустой указатель .

IXmlSerializable. Метод GetSchema Этот метод резервируется и не должен использоваться. При реализации интерфейса IXmlSerializable необходимо возвратить нулевую ссылку (Ничто в Visual Basic) из этого метода, и вместо этого, при определении, что пользовательская схема требуется, примените XmlSchemaProviderAttribute к классу.

И для чтения и для записи, объектный элемент был уже записан, таким образом, Вы не должны добавлять внешний элемент в записи. Например, можно только начать читать/писать атрибуты в двух.

Для запись :

реализация WriteXml, которую Вы обеспечиваете, должна выписать представление XML объекта. Платформа пишет элемент обертки и располагает писателя XML после его запуска. Ваша реализация может записать свое содержание, включая дочерние элементы. Платформа тогда закрывает элемент обертки.

И для читает :

метод ReadXml должен воссоздать Ваш объект с помощью информации, которая была записана методом WriteXml.

, Когда этот метод называют, читатель расположен в начале элемента, который обертывает информацию для Вашего типа. Таким образом, незадолго до тега запуска, который указывает на начало сериализованного объекта. Когда этот метод возвращается, он, должно быть, считал весь элемент с начала до конца, включая все его содержание. В отличие от метода WriteXml, платформа не обрабатывает элемент обертки автоматически. Ваша реализация должна сделать так. Отказ наблюдать эти правила расположения может заставить код генерировать неожиданные исключения на этапе выполнения или поврежденные данные.

я соглашусь, что это немного неясно, но это сводится к "ему, Ваше задание к Read() тег элементов конца обертки".

93
ответ дан Răzvan Flavius Panda 2 February 2017 в 00:17
поделиться
  • 1
    Относительно O (1) для этого вида методов, если такой идентификатор и внутренний ординал связаны уравнением, можно усилить сгенерированный статический массив для получения O (1) (см. мой ответ). – jalopaba 13 March 2013 в 09:24

Я написал одну статью на эту тему с примерами, поскольку документация MSDN к настоящему времени совершенно неясна, а примеры, которые вы можете найти в Интернете, в большинстве случаев реализованы неправильно.

Ловушки обработка локалей и пустых элементов помимо того, что уже упоминал Марк Гравелл.

http://www.codeproject.com/KB/XML/ImplementIXmlSerializable.aspx

33
ответ дан 23 November 2019 в 22:32
поделиться

Да, это всего лишь минное поле, не так ли? Ответ Марка Гравелла в значительной степени покрывает это, но я хотел бы добавить, что в проекте, над которым я работал, нам было довольно неудобно вручную писать внешний элемент XML. Это также приводило к несогласованным именам XML-элементов для объектов одного типа.

Наше решение состояло в том, чтобы определить наш собственный интерфейс IXmlSerializable , производный от системного интерфейса, который добавил метод под названием WriteOuterXml () . Как вы можете догадаться, этот метод просто запишет внешний элемент, затем вызовет WriteXml () , а затем запишет конец элемента. Конечно, системный XML-сериализатор не будет вызывать этот метод, поэтому он был полезен только тогда, когда мы выполняли нашу собственную сериализацию, так что это может быть или не быть полезным в вашем случае. Точно так же мы добавили метод ReadContentXml () , который не считывал внешний элемент, а только его содержимое.

8
ответ дан 23 November 2019 в 22:32
поделиться
Другие вопросы по тегам:

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