Могу ли я не выполнить десериализацию с помощью XmlSerializer в C #, если элемент не найден?
-
06-07-2019 - |
Вопрос
Я использую XmlSerializer для записи и чтения объекта в XML на C #. В настоящее время я использую атрибуты XmlElement
и XmlIgnore
для управления сериализацией объекта.
Если в моем xml-файле отсутствует нужный мне xml-элемент, мой объект все равно десериализуется (xml -> gt; object). Как указать (предпочтительно через атрибуты), что определенное поле является «обязательным»?
Вот пример метода, который я использую в настоящее время:
[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} указано
, в основном используются во время сериализация (исключение составляет {Foo} Specified
, которое устанавливается во время десериализации, а также запрашивается во время сериализации).
Как таковой; не существует простого способа сделать это, если вы не реализуете IXmlSerializable
и делаете это самостоятельно. Поврежденный noob показывает опцию xsd, которая также является опцией.