Могу ли я не выполнить десериализацию с помощью 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, которая также является опцией.

Другие вопросы по тегам