Недавно я прочитал информацию об интерфейсе IXmlSerializable на MSDN и немного смутился по поводу всего тега конца.
Как я понимаю, если вы реализуете IXmlSerializable, вам не нужно писать конечный тег, но вам нужно его прочитать? Например. следующее было бы ошибкой, если мой класс A не читает конечный тег
<A>
<i>32</i>
</A>
Но что произойдет, если содержимое
<A i="32"/>
Если я попытаюсь прочитать конечный тег, я получаю InvalidOperationException. Но если я буду читать дальше, чтобы определить, что я должен читать, это не будет сильно зависеть от позиции читателя?
Я думаю, что я просто немного теряюсь, так как код, с которым я работаю, немного сложнее, когда мне приходится иметь дело с IXmlSerializable детьми (которые могут быть разных типов) и коллекциями элементов IXmlSerializable.
Оба XmlReader
и XPathNavigator
реализовать свойство под названием IsEmptyElement
.
Из документации:
При переопределении в производном классе получает значение, указывающее, является ли текущий node пустой элемент без тега конечного элемента.
Итак, когда вы видите событие start-element, если IsEmptyElement
- true
, вы не должны искать событие конечного элемента. Событие start-element действует как начало и конец для этого случая.
Я вспоминаю XmlReader.IsEmptyElement
. В начале тега, если это установлено, вы имеете <a />
. Если он не установлен, у вас есть <a></a>
. Последний вы читаете конечный тег, первый - нет.
Я думаю, что этот бит о том, чтобы не читать конечный тег, - это сценарий, в котором ваш объект встроен в большую структуру:
public class Wrapper {
public A Wrapped;
}
<Wrapper>
<Wrapped><i>32</i></Wrapped>
</Wrapper>
Я ожидаю, что вам нужно будет читать <Wrapped>
и </Wrapped>
, но не </Wrapper>
.