Puede echar un vistazo a Universal Binary JSON specification. No será tan compacto como Smile porque no hace referencias de nombres, pero es 100% compatible con JSON (donde como BSON y BJSON definen estructuras de datos que no existen en JSON, por lo que no hay una conversión estándar a/de).
También (intencionalmente) es criminalmente fácil de leer y escribir con un formato estándar de:
[type, 1-byte char]([length, 4-byte int32])([data])
tipos de datos tan simples comienzan con un código de marcador de ASCII como 'I' para un int de 32 bits, 'T' para verdadero, 'Z' para nulo, 'S' para cuerda y así sucesivamente.
El formato está diseñado por ingeniería para ser rápido de leer ya que todas las estructuras de datos tienen el prefijo de su tamaño por lo que no hay escaneo para las secuencias terminadas en nulo.
Por ejemplo, la lectura de una cadena que podría ser demarcada como esto (los -chars [] son sólo para fines ilustrativos, que no están escritos en el formato)
[S][512][this is a really long 512-byte UTF-8 string....]
verás la 'S' , enciéndalo para procesar una cadena, vea el entero de 4 bytes que lo sigue de "512" y sepa que puede simplemente tomar en un fragmento los siguientes 512 bytes y decodificarlos de nuevo a una cadena.
De forma similar, los valores numéricos se escriben sin un valor de longitud para ser más compactos porque su tipo (byte, int32, int64, doble) define su longitud de bytes (1, 4, 8 y 8 respectivamente. para números arbitrariamente largos que son extremadamente portátiles, incluso en plataformas que no los admiten).
En promedio, debería ver una reducción de tamaño de aproximadamente 30% con un objeto JSON bien equilibrado (muchos tipos mixtos). Si desea saber exactamente cómo ciertas estructuras se comprimen o no se comprimen, puede consultar la sección Size Requirements para tener una idea.
Por el lado positivo, independientemente de la compresión, los datos se escribirán en un formato más optimizado y serán más rápidos para trabajar.
Revisé el núcleo Input/OutputStream implementations para leer/escribir el formato en GitHub hoy. Verificaré el mapeo general de objetos basado en la reflexión más adelante esta semana.
Puede ver simplemente esas dos clases para ver cómo leer y escribir el formato, creo que la lógica central es algo así como 20 líneas de código. Las clases son más largas debido a las abstracciones de los métodos y a la estructuración de la verificación de los bytes del marcador para garantizar que el archivo de datos sea un formato válido; ese tipo de cosas.
Si tiene preguntas realmente específicas como la endianidad (grande) de la especificación o el formato numérico para dobles (IEEE 754), todo eso está cubierto en el documento de especificaciones o simplemente pregúnteme.
Espero que ayude!
¿por qué no puede usar la compresión en el servidor? – Andrey
Las especificaciones BSON están lejos de ser óptimas tanto en tamaño como en eficiencia. Tal vez deberías considerar almacenar JSON comprimido (con desinflar o algo así). – arthurprs
@Andrey que puede ser una solución posible, pero estoy buscando para ver si hay una manera de reducir la cantidad de datos que alimentamos a la secuencia subyacente (que ya tiene una opción para hacer la compresión sobre la marcha). en teoría, debería ser más fácil comprimirlo en el nivel de codificación del objeto ya que tenemos contexto sobre las etiquetas, etc. –