Can I fail to deserialize with XmlSerializer in C# if an element is not found?

后端 未结 3 1581
天命终不由人
天命终不由人 2020-11-30 11:19

I am using XmlSerializer to write and read an object to xml in C#. I currently use the attributes XmlElement and XmlIgnore to manipulate the seria

相关标签:
3条回答
  • 2020-11-30 11:49

    I've got an answer for the second part: "Attributes that control XML serialization".

    Still investigating the first part...

    EDIT: I strongly suspect you can't do this through XML deserialization itself. I've just run xsd.exe on a sample schema which includes a required attribute - and it's exactly the same if the attribute is marked as being optional. If there were a way of requiring properties to be set, I'd expect it to be implemented in that case.

    I suspect you've basically got to just validate your tree of objects after deserializing it. Sorry about that...

    0 讨论(0)
  • 2020-11-30 11:49

    For extensibility reasons, XmlSerializer is very forgiving when it comes to deserialization; things like [DefaultValue], ShouldSerialize{Foo} and {Foo}Specified are mainly used during serialization (the exception being {Foo}Specified, which is set during deserialization as well as queried during serialization).

    As such; there isn't an easy way to do this, unless you implement IXmlSerializable and do it yourself. damagednoob shows an xsd option, which is also an option.

    0 讨论(0)
  • 2020-11-30 11:55

    The only way I've found to do this is via XSD. What you can do is validate while you deserialize:

    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);
    }
    
    0 讨论(0)
提交回复
热议问题