Pregunta

Estoy buscando algo de información sobre el mejor enfoque serializar un gráfico del objeto en base a la siguiente (Java):

  • dos objetos de la misma clase deben ser binario igual (bit por bit) en comparación con cierto si su estado es igual. (No debe depender de JVM pedido campo).
  • Colecciones solamente se modelan con matrices (nada Colecciones).
  • Todas las instancias son inmutables
  • formato de serialización deben estar en el byte [] en lugar de formato de texto basado.
  • Estoy en control de todas las clases en el gráfico.

No quiero poner un constructor vacío en las clases sólo para la serialización de apoyo. He mirado en la implementación de una solución basada en mi propio recorrido en un Objenisis pero mi problema no parece que la única. Mejor comprobación para cualquier solución existente / completa en primer lugar.

Detalles actualizados:

En primer lugar, gracias por su ayuda!

  • Los objetos deben serializar a exactamente el mismo orden de bits basado en el estado de los objetos. Esto es importante ya que el contenido binario será firmado digitalmente. Reconstrucción del formato serializado se basará en el estado del objeto y no es que los bits originales se almacenan.
  • La interoperabilidad entre diferentes tecnologías es importante. Hago ver el software que se ejecuta en ex. .Net en el futuro. Sin sabor de Java en el formato serializado.

Nota sobre los comentarios de la inmutabilidad: Los valores de las matrices se copian a partir del argumento de los campos internos en el constructor. Menos importante.

Saludos,

Niclas Lindberg

¿Fue útil?

Solución

Es posible que desee familiarizarse con los marcos de serialización disponibles para Java. Un buen punto de partida para que sea el thift-protobuf-compare proyecto, cuyo nombre es engañoso:. se compara el rendimiento de más de 10 formas de serialización de datos mediante el uso de Java

Parece que la restricción más dura que tienes es Interoperability between different technologies. Sé que Googles Protobuffers y Thrift entregan aquí. Avro también podría encajar.

Otros consejos

Se puede escribir los datos usted mismo, usando métodos reflexiones o codificado mano. Utilizo métodos que son código de mano ver, salvo que se generan. (El rendimiento de mano codificada, y la conveniencia de no tener que escribir el código cuando cambia)

A menudo los desarrolladores hablar de la serialización de Java incorporado, pero puede tener una serialización personalizada para hacer lo que quiera, cualquier forma que desee.

Para dar respuesta son más detallada, que dependerá de lo que quiere hacer exactamente.

Por cierto: Usted puede serializar sus datos en el byte [] y todavía que sea legible / texto humana como / editar en un editor de texto. Todo lo que tiene que hacer es usar un formato binario que se parece a texto. ;)

Lo importante saber acerca de la serialización es que no se garantiza que sea consistente a través de múltiples versiones de Java. No es la intención como una forma de almacenar datos en un disco o en cualquier lugar permanente.

Se utiliza internamente para enviar clases de una JVM a otra durante RMI o algún otro protocolo de red. Estos son los tipos de aplicaciones que se deben utilizar para la serialización. Si esto describe su problema - la comunicación de corto plazo entre dos diferentes JVM -. Entonces usted debe tratar de conseguir la serialización ir

Si usted está buscando una manera de almacenar los datos de forma más permanente o se necesitan los datos para sobrevivir en versiones delanteras de Java, entonces usted debe encontrar su propia solución. Teniendo en cuenta sus necesidades, usted debe crear algún tipo de método de conversión de cada objeto en un flujo de bytes sí mismo y leerlo de nuevo en objetos. A continuación, será responsable de asegurarse de que el formato es compatible con versiones futuras objetos y características futuras.

recomiendo encarecidamente el Capítulo 11 del Effective Java por Joshua Bloch.

Es la interfaz Externalizable lo que estás buscando? Usted controla totalmente la forma en que sus objetos se conservan y que hace que el estilo orientado a objetos, con los métodos que se heredan y todo (a diferencia de los métodos de escritura-lectura de objetos / privadas utilizadas con Serializable). Pero aún así, no puede deshacerse de la exigencia constructor accesible sin argumentos.

La única manera que se obtendría esto es:    texto A / USO UTF8, es decir, XML o JSON, binario volvieron a base 64 (http / XML variedad seguro).    B / Hacer cumplir UTF8 binaria ordenamiento de todos los datos.    C / pack los contenidos, excepto todos los espacios en blanco sin escapar.    D / Hash el contenido y proporcionar ese resumen en un lugar posicionalmente estándar en el archivo.

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