Я могу не десериализовать с XmlSerializer в C#, если элемент не найден?

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

Если мой XML-файл пропускает xml элемент, которого я требую, мой объект все еще десериализовывает (xml-> объект) очень хорошо. Как я указываю (предпочтительно через Атрибуты), что определенное поле "требуется"?

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

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

Мое идеальное решение состояло бы в том, чтобы добавить что-то как XmlRequired атрибут.

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

14
задан Deduplicator 1 February 2015 в 14:03
поделиться

3 ответа

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

Все еще исследование первой части...

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

я подозреваю, что Вы в основном добрались, чтобы просто проверить Ваше дерево объектов после десериализации его. Извините за это...

4
ответ дан 1 December 2019 в 12:14
поделиться

Единственным путем я нашел, чтобы сделать, это через 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);
}
16
ответ дан 1 December 2019 в 12:14
поделиться

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

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

4
ответ дан 1 December 2019 в 12:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: