2008-10-22 13 views
5

Tengo una aplicación, escrita en C++ utilizando bibliotecas MFC y Stingray. La aplicación funciona con una amplia variedad de tipos de datos grandes, que en la actualidad están serializados en función de la funcionalidad derivada de serialización y documentos de MFC. También agregué opciones para la serialización XML basada en las bibliotecas Stingray, que implementa DOM a través del Microsoft XML SDK. Si bien es fácil de implementar, el rendimiento es terrible, en la medida en que no se puede usar en documentos que no sean muy pequeños.La mejor biblioteca de serialización XML para una aplicación MFC C++

Qué otras herramientas de serialización de XML recomendarían para este escenario. No quiero DOM, ya que parece ser un problema de memoria, y ya estoy lidiando con datos de memoria grandes. Idealmente, me gustaría un analizador de transmisión que sea rápido y fácil de usar con MFC. Mi favorito actual es expat que es rápido y simple, pero requeriría mucha clase por código de serialización de clase para ser agregado. ¿Alguna otra alternativa eficiente y más fácil de implementar que las personas recomendarían?

Respuesta

4

La biblioteca Boost Serialization es compatible con XML. Esta biblioteca básicamente consiste en:

  1. Comience desde los principios de la serialización MFC y tome todas las cosas buenas que proporciona.
  2. ¡Resuelva cada problema de serialización MFC!

Entre las mejoras en comparación con MFC es compatible con XML. Tenga en cuenta que no controla necesariamente el esquema XML de esta serialización. Utiliza su propio esquema.

+0

La serialización de impulso parece un buen ajuste, y bien podría ser un buen primer paso para alejarse de MFC. –

2

Una buena solución sería libxml. Proporciona análisis SAX livianos y estructuras de datos para el procesamiento de XML. Hay varias bibliotecas DOM que están construidas sobre libxml.

Desafortunadamente es una biblioteca C, pero hay envolturas C++ disponibles.

Hace unos años cambié de MSXML a libxml debido a los problemas de rendimiento que mencionaste.

Si decide usar libxml, también debería echar un vistazo a libxslt.

+0

¡LibXML todo el camino! No olvides su componente hermano, LibXSLT. – spoulson

+0

Buen punto, lo mencioné en mi respuesta. –

2

Utilizamos Xerces-C++. Fue fácil de configurar y el rendimiento es lo suficientemente bueno para que no tengamos que pensar en cambiar. Sin embargo, no somos pesados ​​en XML.

Escuché un podcast by Scott Hanselman (desde Hansel Minutes) donde se comenta el rendimiento XML de MSXML y XSLT.

0

Utilizamos TinyXML para todas nuestras necesidades de XML ya sea MFC o C++ directo.

http://sourceforge.net/projects/tinyxml

+0

Parece que utiliza un enfoque de estilo DOM que probablemente no es adecuado para esta aplicación en particular. Gracias por el enlace de todos modos. –

1

¿qué pasa con RapidXML, lo estoy usando en una aplicación MFC con alguna modificación para soportar UTF-16 con std :: string. Estoy bastante satisfecho con eso hasta ahora.

+0

std :: string debe ser std :: wstring, perdón por el error tipográfico. -tomgee –

4

Este es un problema antiguo. Fui el líder del equipo de desarrollo con las dependencias de ruta más críticas en el proyecto de software más grande del mundo durante 1999 y 2000 y este mismo tema fue el enfoque de mi trabajo durante ese tiempo. Estoy convencido de que la rueda fue inventada por varios ingenieros que desconocían que otros ya la habían inventado. Lo mismo se aplica al enlace de datos XML en C++. Lo inventé también, y lo he estado perfeccionando durante más de 10 años en varios proyectos.Tengo una solución que resuelve los problemas señalados aquí y algunos problemas adicionales que aparecen repetidamente:

  1. Actualizaciones XML. Esta es la capacidad de volver a aplicar un subconjunto de XML en un modelo de objetos existente. En muchos casos, el XML está vinculado a objetos indexados y no podemos permitirnos volver a indexar para cada actualización.

  2. Gestión de interfaz COM y CORBA. En el mismo sentido, la vinculación de datos XML se puede automatizar a través de prácticas orientadas a objetos, al igual que las instancias de objetos de interfaz que proporcionan esos datos a la capa de aplicación.

  3. Seguimiento del estado. La aplicación a menudo necesita distinguir entre un valor vacío y un valor perdido; ambos crean una cadena vacía. Esto proporciona la validación junto con la vinculación de datos.

El código fuente utiliza la licencia menos restrictiva, menos para que GPL. El proyecto es apoyado y gestionado desde aquí:

http://www.codeproject.com/KB/XML/XMLFoundation.aspx

Ahora que es el año 2010, creo que nadie más lo intente reinventar la rueda, porque hay unos cuantos para elegir. En mi humilde opinión, esta rueda es la implementación más pulida y completa disponible.

Disfrútalo.

1

El gSOAP auto-serializa conjunto de herramientas de datos de C++ a/desde XML nativo de C y y es compatible con la especificación del esquema XML completo a través de enlaces de datos XML:

gSOAP SourceForge Project

ha evolucionado desde 1999 a una base de código significativa con herramientas y bibliotecas de generación de código. Admite muchas funciones de enlace de datos y personalización, lo que es especialmente crítico para mapear tipos de esquema XML a/desde los tipos C y C++. Puede serializar cualquier tipo de C/C++ y también contenedores STL, plantillas de contenedor y estructuras de datos cíclicos. Se ha utilizado en el grupo de trabajo W3C Schema Patterns for Databinding (con un éxito de cobertura de patrón de esquema del 100% desde hace años). Existe una base activa de usuarios de código abierto y la funcionalidad de desarrollo gSOAP se ha utilizado en muchos proyectos industriales y empresas Fortune 100 para desarrollar infraestructuras SOAP/XML.

1

Esto es tarde en el juego, solo quiero mencionar que también usamos LIBXML. Es robusto y confiable, y funcionó bien. Un poco demasiado bajo nivel, querrá construir algunas envolturas en la parte superior de sus funciones.

Por ejemplo, usted obtendrá una secuencia diferente de las declaraciones de función dependiendo de si usted tiene esto:

<tag attribute="value"/> 

o esto:

<tag attribute="value"> </tag> 

A veces es conveniente que, a veces don no me importa

Cuestiones relacionadas