Pregunta

Estoy usando XmlSerializer para escribir y leer un objeto en xml en C #. Actualmente uso los atributos XmlElement y XmlIgnore para manipular la serialización del objeto.

Si a mi archivo xml le falta un elemento xml que requiero, mi objeto aún se deserializa (xml - > object) muy bien. ¿Cómo indico (preferiblemente a través de Atributos) que un determinado campo es "obligatorio"?

Aquí hay un método de muestra de lo que estoy usando actualmente:

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

Mi solución ideal sería agregar algo como un atributo XmlRequired .

Además, ¿hay una buena referencia de qué atributos están disponibles para manipular el comportamiento de XmlSerializer?

¿Fue útil?

Solución

Tengo una respuesta para la segunda parte: " Atributos que controlan la serialización XML " .

Todavía investigando la primera parte ...

EDITAR: sospecho que no puede hacer esto a través de la deserialización de XML. Acabo de ejecutar xsd.exe en un esquema de muestra que incluye un atributo requerido, y es exactamente lo mismo si el atributo está marcado como opcional. Si hubiera una forma de exigir que se establecieran propiedades, esperaría que se implementara en ese caso.

Sospecho que básicamente tienes que validar tu árbol de objetos después de deserializarlo. Lo siento por eso ...

Otros consejos

La única forma en que he encontrado para hacer esto es a través de XSD. Lo que puede hacer es validar mientras deserializa:

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);
}

Por razones de extensibilidad, XmlSerializer es muy indulgente cuando se trata de deserialización; cosas como [DefaultValue] , ShouldSerialize {Foo} y {Foo} Specified se usan principalmente durante serialización (la excepción es {Foo} Specified , que se establece durante la deserialización y se consulta durante la serialización).

Como tal; no hay una manera fácil de hacer esto, a menos que implemente IXmlSerializable y lo haga usted mismo. damagenoob muestra una opción xsd, que también es una opción.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top