2011-01-13 37 views
5

Estoy trabajando en una aplicación distribuida que tiene dos componentes. Uno está escrito en C++ estándar (no administrado C++ y se ejecuta en una plataforma Linux) y el otro está escrito en C#. Ambos se están comunicando a través de un bus de mensajes.serialización binaria/deserialización en C++ y C#

Tengo una situación en la que necesito pasar objetos de la aplicación C++ a C# y para esto necesito serializar esos objetos en C++ y deserializarlos en C# (algo como marshaling/un-marshaling en .NET) . Necesito realizar esta serialización en formato binario y no en XML (por razones de rendimiento).

He usado Boost.Serialization para hacer esto cuando ambos extremos se implementaron en C++ pero ahora que tengo una aplicación .NET en un extremo, Boost.Serialization no es una solución viable.

Estoy buscando una solución que me permita realizar (de) serialización en C++ y .NET Boundary, es decir, multiplataforma serial binaria.

Sé que puedo implementar el código de (de) serialización en un dll de C++ y usar P/Invoke en la aplicación .NET, pero quiero mantenerlo como último recurso.

Además, quiero saber si uso algún estándar como gzip, ¿será eficiente? ¿Hay alguna otra alternativa a gzip? ¿Cuáles son los pros/contras de ellos?

Gracias

+0

Mi mejor sugerencia es NO hacerlo. Use json, xml u otra cosa para transferir sus datos. Implemente eso PRIMERO, si termina demasiado lento entonces analice lo que toma tiempo ... – Cine

+1

Empecé con la serialización de XML y resultó ser más lento en comparación con la serialización binaria (con ambos extremos ejecutando una aplicación de C++). Esta es la razón por la que elegí Boost.Serialization en primer lugar. –

+0

¿Ha considerado desarrollar una aplicación COM simple, C++ y.NET admite la tecnología COM, hasta donde yo sé. –

Respuesta

4

gzip no directamente ayuda con la serialización - se acaba (intento de) reducir un arroyo. Esto puede ayuda, o no, dependiendo de la cantidad de datos duplicados en la secuencia. Para los datos densos con poco texto, he visto gzip aumentar el tamaño de la carga útil.

Personalmente me gustaría mirar protocol buffers aquí (pero soy parcial, ya que soy uno de los autores de many extensions). Normalmente (pero no siempre) define los mensajes en un lenguaje básico (un archivo .proto) y ejecuta herramientas específicas del lenguaje para generar las clases. El rendimiento es muy bueno - centrándose en .NET puede ahora superar los serializadores incorporadas (123)

+0

+1 por sugerir PB –

5

recomendaría búferes de protocolo, que es propia biblioteca de serialización de Google. Tiene dos serializadores .Net, C++ y Java. La mayoría de las implementaciones también son bastante rápidas.

http://code.google.com/p/protobuf/

+0

Gracias para la sugerencia Lo investigaría. –

3

Otra posibilidad sería Thrift, que tiene aún más backends y si es necesario proporciona una buena parte del código necesario para comunicación de red - en caso de que quiera escalar.

Si solo quieres una fácil serialización de objetos, echa un vistazo a json.org. Hay muchas implementaciones de C++/.NET.