Pregunta

Pregunta: ¿Qué tan común es para un desarrollador crear su propio formato de serialización? Específicamente, estoy usando Java esencialmente envía el objeto como una cadena gigante con tokens para delimitar variables.

Mi lógica: Elegí esto porque casi elimina la dependencia del lenguaje (ignorar el UTF-8 modificado de Java), tampoco tiene el problema de la versión del objeto en el que si usa la serialización de Java, el extremo receptivo tiene que tener exactamente la misma versión del Objeto, por lo que un cliente que se ejecuta en una versión anterior no podría recibir ninguno de los datos de objetos. El código no es demasiado feo y se lee bien, pero supongo que mi pregunta es ¿cuáles son las mejores prácticas para este caso? Esto es para un proyecto personal.

Otras opciones conocidas: Bien, solo estaba trabajando con serialización de un objeto para enviarlo a través de la red y me había encontrado buffers de protocolo Googles. ¿Qué tan estandarizado está serializando un objeto? Básicamente, he encontrado tres formas de hacerlo. (Voy a hablar sobre Java aquí, ya que para eso lo hice) 1) Use las clases de serialización nativas del idioma (Java) 2) Use su propia forma de serializar el objeto que posiblemente use cadenas y tokens 3) Use buffers de protocolo o algún otro formato conocido (JSON, XML, etc.)

Por lo que he recopilado, esencialmente tiene 3 objetivos principales que lograr al serializar: 1) Velocidad/eficiencia/tamaño 2) Independencia del lenguaje 3) Aceptación de la versión (en esa antigua versiones del código aún puede aceptar partes de la nueva versión y Vicepresidente Versa)

¿La mayoría de los proyectos de software grandes utilizan buffers de protocolos? ¿Cambia si su cliente es un dispositivo móvil con mucho menos recursos?

¿Fue útil?

Solución

Si utiliza un formato estándar (JSON, XML o incluso Buffers de Proto), habrá muchas más oportunidades para extender su aplicación a través de puntos de integración. Pero si es solo interno, entonces haz lo fácil. Personalmente, creo una clase proxy persistente dedicada que representa la forma serializada de un objeto dado. Luego, serializa ese objeto usando cualquier método que tenga más sentido (serialización de Java para transferencias vivas de exceso de alambre, XML para persistencia a largo plazo) usando WriterePlace y Readresolve. A medida que la clase evoluciona, puedo crear implementaciones completamente nuevas del proxy persistente, agregar versiones al proxy, etc., según corresponda. Creo que Bloch analiza este patrón en Java efectivo.

En cuanto a la creación de un protocolo de alambre puramente desde el rasguño, realmente depende de la importancia del rendimiento para una aplicación. Como con la mayoría de las cosas, cuanto más pueda aprovechar las bibliotecas/protocolos estándar, más rápido podrá sacar el nuevo código por la puerta. Cuando veo una gran parte del código involucrado con la serialización/etc., generalmente lo considero un olor a código y presto mucha atención a si estaba justificado o no. Solo mis $ 0.02.

Y PD: alguien publicó una pregunta sobre gráficos ... Esta es en realidad un área donde he evitado intencionalmente la serialización estándar. La capacidad de Java para serializar gráficos complejos no es excelente: termina con problemas de desbordamiento de pila (HAH) si el gráfico es incluso remotamente complejo. En estos casos, un proxy persistente es muy, muy importante.

Otros consejos

Pregunta: ¿Qué tan común es para un desarrollador crear su propio formato de serialización?

Suponiendo que te refieres a crearlo desde cero, entonces la respuesta es "bastante poco común".

Además, diría que no es "la mejor práctica" hacer esto en general. En la mayoría de los casos, una de las alternativas existentes de uso común (serialización de Java, JSON, XML, etc.) proporciona una buena solución.

OMI, solo debe considerar "rodar su propio" formato (e implementar el código de serialización / deserialización correspondiente) si tiene un requisito claro para hacerlo, o si tiene evidencia clara de que las alternativas existentes no funcionará. La sabiduría popular de que "XYZ es lento" no es evidencia suficiente.

Varias cosas que inmediatamente surgen en mi mente:

  • Incluya el número de versión, ya sea en cada mensaje o en la negociación de conexión. Te salvará de enormes dolores de cabeza. Preferiblemente, deje que el remitente sepa qué versión admite el receptor.

  • A menos que envíe datos que son naturalmente binarios (imágenes, sonido), use un formato de texto simple (UTF-8). Ayudará a solucionar muchos problemas. Me quedaría con JSON, pero puede que no sea óptimo para ti. XML tiene una alta overosidad.

  • Si sus mensajes son lo suficientemente largos, puede intentar comprimirlos con un algoritmo bien conocido, como GZIP (GZIPOUTPUTStream).

Como puede ver, estos pasos promueven la apertura del formato y el acoplamiento suelto entre su servidor y sus posibles clientes. Nadie sabe qué tecnología tendrán que usar sus clientes en el futuro: ¿Te gustaría hacer un cliente de iPhone? ¿Un cliente HTML5+JS? Lo mismo para el servidor :)

Para los datos estructurados XML, es probable que JSON sea la mejor opción. Sin embargo, para registros planos simples, le sugiero que considere CSV. Puede encontrar su implementación más simple/más rápido de implementar. Si tiene una gran cantidad de registros, pueden ser más fáciles de administrar un pozo. por ejemplo, carga en una hoja de cálculo

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