una tipo serializar reflejar new net example error deserializar clase c# xml xml-serialization .net-attributes

tipo - system xml serialization example c#



¿Puedo dejar de deserializar con XmlSerializer en C#si no se encuentra un elemento? (3)

Estoy usando XmlSerializer para escribir y leer un objeto a 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 requiera, mi objeto todavía se deserializa (xml -> object) muy bien. ¿Cómo señalo (preferiblemente a través de Atributos) que cierto campo es "requerido"?

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 así como un atributo XmlRequired .

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


La única forma que he encontrado para hacerlo es a través de XSD. Lo que puedes hacer es validar mientras deserializas:

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 en lo que respecta a la deserialización; cosas como [DefaultValue] , ShouldSerialize{Foo} y {Foo}Specified se usan principalmente durante la 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 hacerlo, a menos que implemente IXmlSerializable y lo haga usted mismo. damagednoob muestra una opción xsd, que también es una opción.


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

Todavía investigando la primera parte ...

EDITAR: Sospecho fuertemente que no puedes 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 obligatorio, y es exactamente lo mismo si el atributo está marcado como opcional. Si hubiera una manera de exigir el establecimiento de 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...