2010-03-30 18 views
23

un comentario en la announcement blog post:¿Hay una asignación estándar entre JSON y Buffers de protocolo? De

En cuanto a JSON: JSON está estructurado de manera similar a búferes de protocolo, pero búfer de protocolo formato binario sigue siendo pequeño y más rápido para codificar. JSON hace un gran codificación de texto para búferes de protocolo, sin embargo - que es trivial para escribir un codificador/decodificador que convierte el protocolo arbitrario mensajes hacia y desde JSON, utilizando protobuf reflexión. Esta es una buena forma de comunicarse con aplicaciones AJAX, ya que hacer que el usuario descargue un decodificador completo de protobuf cuando visite su página podría ser demasiado.

Puede ser trivial para cocinar un mapeo, pero hay una sola mapeo "evidente" entre los dos que cualquiera de los dos equipos de desarrollo independientes se conformaría de forma natural en? Si dos productos soportaban datos PB y podían interoperar porque compartían la misma especificación .proto, me pregunto si aún podrían interoperar si introdujeran de forma independiente una reflexión JSON de la misma especificación. Es posible que se tomen decisiones arbitrarias, p. ¿deberían los valores enum ser representados por una cadena (para ser legible por humanos a la JSON típica) o por su valor entero?

Entonces, ¿existe una asignación establecida y cualquier implementación de código abierto para generar codificadores/decodificadores JSON a partir de especificaciones .proto?

Respuesta

1

Sí, ya Protocol Buffers versión 3.0.0 (Publicada el 28 de de julio de, 2016) hay es "una codificación bien definido en JSON como alternativa a binario proto codificación" como se menciona en la liberación observa

https://github.com/google/protobuf/releases/tag/v3.0.0

6

Por lo que he visto, Protostuff es el proyecto de utilizar para cualquier trabajo de PB en Java, incluyendo la serialización como JSON, basado en la definición de protocolo. No lo he usado yo solo, solo escuché cosas buenas.

+0

No hay entradas nuevas [CHANGELOG] (https://github.com/protostuff/protostuff/blob/master/CHANGELOG.md) desde 2015. Sin cambios en absoluto durante 5 meses. Un proyecto moribundo? – Raedwald

1

Una idea adicional: si los objetos protobuf tienen getters/setters, o los campos apropiadamente nombrados, uno podría simplemente usar el enlace de datos del procesador JSON Jackson. De forma predeterminada, maneja getters públicos, cualquier setter y campos públicos, pero estos son solo niveles de visibilidad predeterminados y se pueden cambiar. Si es así, Jackson puede serializar/deserializar POJO generados por protobuf sin problemas.

En realidad, he usado este enfoque con objetos generados por Thrift; lo único que tuve que configurar allí fue deshabilitar la serialización de varios métodos "isXXX()" que Thrift agrega para verificar si un campo ha sido explícitamente asignado o no.

+2

No es tan simple: los objetos Java generados a partir de las especificaciones de protobuf son de solo lectura y usan una clase de generador para crear nuevas instancias. – djjeck

+0

Esto puede haber cambiado, pero en el pasado, creo que las propiedades no eran definitivas y, por lo tanto, podían cambiarse a través de Reflection; por eso Jackson puede modificarlos incluso si el código de Java normal no pudiera. – StaxMan

2

Necesitaba generar una compilación desde GeneratedMessageLite a un objeto JSON pero no era necesario descalificar. No pude usar la biblioteca de protobuf en la respuesta de Pangea porque no funciona con la opción LITE_RUNTIME. Tampoco quería cargar con nuestro ya enorme sistema heredado con la generación de más código compilado para los búferes de protocolo existentes. Para mashalling a JSON, fui con esta sencilla solución para reunir

final Person gpb = Person.newBuilder().setName("Bill Monroe").build(); 
    final Gson gson = new Gson(); 
    final String jsonString = gson.toJson(gpb); 
0

En primer lugar creo que uno debería razonar con mucho cuidado en poner un esfuerzo en convertir un conjunto de datos a protobuffs. Aquí mis razones para convertir un conjunto de datos a protobuffs

  1. Tipo Seguridad: garantía en el formato de los datos que se están considerando.
  2. huella de memoria sin comprimir de los datos.La razón por la que menciono sin comprimir es porque la compresión posterior no es muy diferente en el tamaño de JSON comprimido y protocomprimido, pero la compresión tiene un costo asociado. Además, la velocidad de serialización/deserialización es casi similar, de hecho, Jackson json es más rápido que protobuffs. Consulte el siguiente enlace para obtener más información http://technicalrex.com/2014/06/23/performance-playground-jackson-vs-protocol-buffers/
  3. Los protobuffs deben transferirse a través de la red mucho.

Decir que una vez que convertir su conjunto de datos en formato JSON Jackson en la forma en que la definición ProtoBuff se define a continuación, que puede ser muy fácilmente mapeada directamente en formato ProtoBuff utilizando el Protostuff: JsonIoUtil: función mergeFrom. Firma de la función:

public static <T> void mergeFrom(JsonParser parser, T message, Schema<T> schema, boolean numeric) 

referencia a protostuff

Cuestiones relacionadas