Могу ли я не выполнить десериализацию с помощью XmlSerializer в C#, если элемент не найден?
Я использую XmlSerializer для записи и чтения объекта в XML на C#. Я в настоящее время использую атрибуты XmlElement
а также XmlIgnore
манипулировать сериализацией объекта.
Если в моем файле XML отсутствует элемент XML, который мне требуется, мой объект все равно десериализуется (xml -> object). Как мне указать (предпочтительно через атрибуты), что определенное поле является "обязательным"?
Вот пример метода, который я использую в настоящее время:
[XmlElement(ElementName="numberOfWidgets")]
public int NumberThatIsRequired {
set ...;
get ...;
}
Моим идеальным решением было бы добавить что-то вроде XmlRequired
приписывать.
Кроме того, есть хорошая справка о том, какие атрибуты доступны для управления поведением XmlSerializer?
3 ответа
У меня есть ответ для второй части: "Атрибуты, управляющие сериализацией 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
и сделай это сам. Поврежденный noob показывает опцию xsd, которая также является опцией.