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

StackOverflow https://stackoverflow.com/questions/259726

Вопрос

Я использую 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, которая также является опцией.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top