Я использую XmlSerializer, чтобы записать и считать объект в xml в C#. Я в настоящее время использую атрибуты XmlElement
и XmlIgnore
управлять сериализацией объекта.
Если мой XML-файл пропускает xml элемент, которого я требую, мой объект все еще десериализовывает (xml-> объект) очень хорошо. Как я указываю (предпочтительно через Атрибуты), что определенное поле "требуется"?
Вот выборочный метод того, что я использую в настоящее время:
[XmlElement(ElementName="numberOfWidgets")]
public int NumberThatIsRequired {
set ...;
get ...;
}
Мое идеальное решение состояло бы в том, чтобы добавить что-то как XmlRequired
атрибут.
Кроме того, есть ли хорошая ссылка для того, какие Атрибуты доступны для управления поведением XmlSerializer?
У меня есть ответ для второй части: "Атрибуты, которые управляют сериализацией XML" .
Все еще исследование первой части...
РЕДАКТИРОВАНИЕ: Я сильно подозреваю, что Вы не можете сделать этого посредством самой десериализации XML. Я только что выполнил xsd.exe на демонстрационной схеме, которая включает необходимый атрибут - и это - точно то же, если атрибут отмечен как являющийся дополнительным. Если бы был способ потребовать, чтобы свойства были установлены, то я ожидал бы, что это будет реализовано в этом случае.
я подозреваю, что Вы в основном добрались, чтобы просто проверить Ваше дерево объектов после десериализации его. Извините за это...
Единственным путем я нашел, чтобы сделать, это через XSD. То, что можно сделать, проверяют, в то время как Вы десериализовываете:
static T Deserialize<T>(string xml, XmlSchemaSet schemas)
{
//List<XmlSchemaException> exceptions = new List<XmlSchemaException>();
ValidationEventHandler validationHandler = (s, e) =>
{
//you could alternatively catch all the exceptions
//exceptions.Add(e.Exception);
throw e.Exception;
};
XmlReaderSettings settings = new XmlReaderSettings();
settings.Schemas.Add(schemas);
settings.ValidationType = ValidationType.Schema;
settings.ValidationEventHandler += validationHandler;
XmlSerializer serializer = new XmlSerializer(typeof(T));
using (StringReader sr = new StringReader(xml))
using (XmlReader books = XmlReader.Create(sr, settings))
return (T)serializer.Deserialize(books);
}
По причинам расширяемости, XmlSerializer
является очень прощающим когда дело доходит до десериализации; вещи как [DefaultValue]
, ShouldSerialize{Foo}
и {Foo}Specified
главным образом используются во время сериализация (исключение, являющееся {Foo}Specified
, который установлен во время десериализации, а также запрошен во время сериализации).
Как таковой; нет простого способа сделать это, если Вы не реализуете IXmlSerializable
и делаете это сами. damagednoob показывает xsd вариант, который является также опцией.