Serialización de Java: recuperación del archivo serializado después del bloqueo del proceso

Tengo un siguiente caso de uso.

  • Un proceso serializa ciertos objetos a un archivo usando BufferedOutputStream.
  • Después de escribir cada objeto, el proceso invoca flush()
  • El caso de uso es que si el proceso se bloquea al escribir un objeto, quiero recuperar el archivo hasta el objeto anterior que se ha escrito correctamente.

¿Cómo puedo deserializar dicho archivo? Cómo se comportará Java mientras se deserializa dicho archivo.

  • ¿Se deserializará con éxito hasta el objeto que se escribió correctamente antes del bloqueo?
  • Mientras lee el último objeto parcialmente escrito, cuál será el comportamiento. ¿Cómo puedo detectar eso?

Actualización1 -

  • He intentado simular el bloqueo del proceso eliminando manualmente el proceso mientras se escriben los objetos. Lo he intentado entre 10 y 15 veces. Cada vez puedo deserializar el archivo y el archivo no tiene ningún objeto parcial.

No estoy seguro de si mi prueba es lo suficientemente exhaustiva y, por lo tanto, necesito más consejos.

Actualización 2: Adam había señalado una forma de simular dicha prueba al truncar el archivo al azar. A continuación se muestra el comportamiento observado para probar alrededor de 100 iteraciones:

  • Desde el archivo truncado (que debería ser equivalente a la condición del archivo cuando se bloquea un proceso), Java puede leer hasta el último objeto completo con éxito.
  • Al llegar al último objeto parcialmente escrito, Java no arroja ninguno StreamCorruptedExceptiono IOException. Simplemente arroja el EOFExceptionindicado EOFe ignora el objeto parcial.
Respuesta 1

Sí, probar tal escenario manualmente (matando el proceso) puede ser difícil. Sugeriría escribir un caso de prueba, donde usted:

  1. Serializar un conjunto de objetos y escribirlos en un archivo.
  2. Abra el archivo y básicamente trúnquelo en una posición aleatoria.
  3. Intenta cargar y deserializar (y ver qué pasa)
  4. Repita 1. a 3. con varias otras posiciones truncadas.

De esta manera, está seguro de que está cargando un archivo roto y que su código lo maneja correctamente.

Respuesta: 2

Cada objeto se deserializa o no antes de leer el siguiente. No se verá afectado porque un objeto posterior no se pudo escribir o no se deserializará

Respuesta: 3

Sospecho que está utilizando indebidamente la serialización de Java: no pretende ser un medio confiable y recuperable de almacenamiento permanente. Use una base de datos para eso. Si debe hacerlo, puede usar una base de datos para almacenar la forma serializada de objetos java, pero eso sería bastante ineficiente.

Respuesta: 4

Estoy usando un servicio en primer plano para rastrear la ubicación en vivo del usuario. está funcionando bien en los dispositivos Android comunes, pero en marcas como oppo, vivo, Mi, etc., la aplicación se cierra cuando el dispositivo entra en funcionamiento ...

Ahora me enfrento a este problema y todavía no conozco una solución. El documento sobre Xamarin es bastante vago para mí en este asunto. El hecho de que los Java Generics se implementen como borrado de texto es bastante ...

Al usar owasp.esapi para filtrar los parámetros y encabezados de solicitudes entrantes, me encuentro con un problema en el que aparentemente el encabezado Referer contiene un valor que se considera como "codificación múltiple". ...

Necesito leer la hoja xls o xlsx. Leí con éxito la hoja, pero devuelve un valor decimal en lugar de una cadena (por ejemplo: para 3, devuelve 3.0). Necesito leer los valores de las celdas tal como están. así que necesito ...