Могу ли я не выполнить десериализацию с помощью XmlSerializer в C #, если элемент не найден? - PullRequest
14 голосов
/ 03 ноября 2008

Я использую XmlSerializer для записи и чтения объекта в XML в C #. В настоящее время я использую атрибуты XmlElement и XmlIgnore для управления сериализацией объекта.

Если в моем xml-файле отсутствует нужный мне xml-элемент, мой объект все равно десериализуется (xml -> object). Как мне указать (желательно через атрибуты), что определенное поле является «обязательным»?

Вот пример того, что я использую в настоящее время:

[XmlElement(ElementName="numberOfWidgets")]
public int NumberThatIsRequired {
    set ...;
    get ...;
}

Мое идеальное решение - добавить что-то вроде XmlRequired атрибута.

Кроме того, есть ли хорошая справка о том, какие атрибуты доступны для управления поведением XmlSerializer?

Ответы [ 3 ]

16 голосов
/ 04 ноября 2008

Единственный способ найти это - через 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);
}
4 голосов
/ 04 ноября 2008

По причинам расширяемости, XmlSerializer очень простителен, когда дело доходит до десериализации; такие вещи, как [DefaultValue], ShouldSerialize{Foo} и {Foo}Specified, в основном используются во время сериализации (исключение составляет {Foo}Specified, которое устанавливается во время десериализации, а также запрашивается во время сериализации) .

Как таковой; Нет простого способа сделать это, если вы не внедрите IXmlSerializable и не сделаете это сами. Поврежденный noob показывает опцию xsd, которая также является опцией.

4 голосов
/ 03 ноября 2008

У меня есть ответ для второй части: "Атрибуты, управляющие сериализацией XML" .

Все еще расследую первую часть ...

РЕДАКТИРОВАТЬ: я сильно подозреваю, что вы не можете сделать это с помощью самой десериализации XML. Я только что запустил xsd.exe на примере схемы, которая содержит обязательный атрибут - и он точно такой же, если атрибут помечен как необязательный. Если бы был способ требовать установки свойств, я бы ожидал, что он будет реализован в этом случае.

Я подозреваю, что вам нужно просто проверить ваше дерево объектов после десериализации. Извините за это ...

...