2009-04-04 19 views
5

¿Cuál es el mejor enfoque para serializar gráficos de objetos java?serialización eficiente de gráficos de objetos Java

Mis requisitos para la biblioteca de serialización son 1) velocidad de deserialización 2) de tamaño - tan pequeño como flexibilidad posible (menor que en java serialización por defecto) 3) - definiciones basadas anotación de lo que tiene que ser serializado sería bueno .

el formato de archivo subyacente no es importante.

Miré Protocol Buffers y XStream, pero el primero no es lo suficientemente flexible debido a la necesidad de mapear archivos y luego produce grandes archivos.

Cualquier ayuda apreciada.

+0

Comparación de serializadores JVM (https://github.com/eishay/jvm-serializers/wiki) tiene información útil para el rendimiento, así como el resultado de tamaño publicación por entregas. Solo cubre un caso de uso (un tipo de objeto serializado), pero da una idea. – StaxMan

Respuesta

1

Para la serialización, Hessian es una de las más eficientes.

Esto es aproximadamente 2-3 veces más pequeño y más rápido que la serialización Java, incluso utilizando clases Externalizable.

Cualquiera que sea la serialización que utilice, puede usar la compresión con bastante facilidad para que los datos sean más compactos.

Más allá de eso, puede escribir su propia serialización. Escribí un serializador que escribe en/desde ByteBuffer, que es aproximadamente el doble de rápido y la mitad del tamaño de Hessian (aproximadamente 5 veces más rápido/más pequeño que Java Serialization). Esto puede ser demasiado esfuerzo con poca ganancia si las serializaciones existentes harán lo que necesites. Sin embargo, es tan personalizable como desee;)

+0

¿Qué tipo de serializador escribiste? ¿Funciona para cualquier objeto o necesita escribir un código de serialización personalizado para cada clase? ¿Se permiten referencias a objetos cíclicos? –

+0

Es muy parecido a Hessian. Puede serializar cualquier objeto, excepto aquellos que modelan recursos reales fuera de Java, como Threads, Sockets, etc. Usted puede escribir serializaciones personalizadas, pero como usa una compresión inteligente sobre la marcha, la carpa serializadora personalizada es más lenta. –

+0

"¿Se permiten referencias a objetos cíclicos?" - Tener una versión de código abierto que no es compatible con esto y otra que escribí otra versión para el trabajo que sí lo hace. ;) –

0

Creo que la serialización predeterminada de Java va a ser muy pequeña. ¿No puede restringir de forma útil lo que desea serializar a través de la palabra clave transient? Eso resolvería su tercer problema (flexibilidad y anotaciones)

+0

La serialización predeterminada suele ser enorme para objetos individuales.Esto porque contiene todos los metadatos de clase; para gráficos de objetos más grandes con varias instancias de los mismos tipos, este es un problema menor (solo una definición de clase), pero para los objetos individuales es lamentablemente significativo. – StaxMan

2

Para objetos pequeños, es probable que la forma serializada de Java esté dominada por la descripción de las clases serializadas.

Es posible que pueda escribir datos serializados para clases comúnmente utilizadas, y luego usar eso como un prefijo común para una serie de transmisiones serializadas. Tenga en cuenta que esto es muy frágil, y es probable que desee recalcular y verificarlo para cada instancia del cargador de clases.

0

¿Se adaptan http://jserial.sourceforge.net/ a sus necesidades?

+0

A partir de sus resultados de referencia, parece que la deserialización "Bubble" es * más lenta * que la serialización Java 1.4.2. –

+0

En dos de los puntos de referencia es más lento, en otros es más rápido. Depende de lo que se serializa y, de todos modos, 1.4.2 es antiguo, por lo que debe compararlo con su propia aplicación y entorno para ver si le conviene. –

1

En segundo lugar, la nota sobre la utilidad de la compresión: todos los formatos se comprimen aproximadamente igual, es decir, una salida más grande comprime más.

Más allá de eso y de otras recomendaciones, JSON con Jackson funciona bastante bien: mucho más rápido que XML (competitivo con PB, Hessian) y un poco más compacto; mucho más flexible que PB, fácil de integrar con JS del lado del cliente (si eso importa) y fácil de solucionar problemas.

+0

¡En segundo lugar esto (JSON/Jackson)! Ver: http://spring-java-ee.blogspot.com/2010/12/how-to-dumpinspect-object-or-variable.html –

0

Puede usar Databoard para hacer una serialización recursiva.

Se vería algo como esto ..

@Referable class Node { 
    public int id; 
    public Node[] reference; 
    public Node(int id, Node...reference) { 
     this.id = id; 
     this.reference = reference; 
    } 

} 

public static void main(String[] args) throws Exception { 

    Node a = new Node(0); 
    Node b = new Node(1); 
    Node c = new Node(2); 
    a.reference = new Node[] {b, c}; 
    b.reference = new Node[] {a}; 
    c.reference = new Node[] {c}; 

    Binding binding = Bindings.getBinding(Node.class); 
    Serializer s = binding.serializer(); 
    byte[] data = s.serialize(a); 

    Node d = (Node) s.deserialize(data); 
    System.out.println(binding.toString(d)); 
} 
Cuestiones relacionadas