Pregunta

Actualmente estoy usando XmlSerializer que, sorprendentemente :), manija de / serialización de mis estructuras de datos - Me resulta maravillosamente simple de usar, pero a costa de la flexibilidad. Por el momento, lo estoy usando para una estructura basada en árbol; XmlSerializer ya no se ocupa de estructuras cíclicas, he añadido a mi propiedad [XmlIgnore] Parent, y hacer una iteración posterior a la deserialización sobre el árbol para arreglar los padres de los nodos.

¿Hay una mejor manera de manejar esto utilizando XmlSerializer, o sería mejor volver a escribir el código usando XmlReader/XmlWriter? Supongo que la implementación de IXmlSerializable iba a funcionar, pero parece que una buena cantidad de trabajo, al tiempo que conserva los contras de XmlSerializer.

El paso actual post-deserialización está bien, pero estoy añadiendo una estructura de datos que tiene que ser serializado en un archivo XML independiente: básicamente una lista plana de elementos que necesitan una propiedad Parent referencia a un nodo de la estructura de árbol anterior . Esto requeriría todavía un paso posterior a la deserialización, así como mantener tanto un atributo padre, así como como parentid (o algún engaño) en la nueva estructura de datos.

Por lo tanto, cualquier idea inteligentes (y no frágiles)? O XmlReader/XmlWriter es?

Solución

DataContractSerializer resultó ser una solución decente bonita, con más o menos la misma sencillez que XmlSerializer. Opté no utilizar el manejo ciclo automático pero en lugar de definir y OnDeserialized decorado método para establecer el nodo padre mango; de esa manera, el XML generado es disconforme estándar.

Una cosa que me confundió por un tiempo fue que llegué accidentes en algunas propiedades después de deserializar, con los elementos de apoyo establecido en nulo - no podía averiguar cómo esto era posible, ya que los elementos de apoyo se inicializan definitivamente en todos los constructores posibles . La depuración de los constructores mostraron que nunca fueron llamados, y después de algunas google he encontrado este SO post con una explicación.

¿Fue útil?

Solución

Usted podría tratar de serialización binaria (BinarySerializer o DataContractSerializer), que creo que las manijas gráficos cíclicos algo mejor, a costa de no tener una representación legible de los datos. Alternativamente, se puede probar el SoapFormatter como se detalla aquí .

Otros consejos

Uso DataContractSerializer. Marque sus clases con [DataContract(IsReference = true)].

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