¿Alguien sabe cómo se serializa un java.util.Date? Me refiero a explicarme exactamente qué es cada byte. Traté de escribir una fecha larga y luego una y puedo ver coincidencias, pero hay otros personajes que simplemente no entiendo.Serializando java.util.Date
Nuestra aplicación realiza solicitudes de servidor con datos, lo que significa que se serializa de cliente a servidor. El equipo que realiza pruebas de estrés utiliza una herramienta que captura estas solicitudes y las modifica, el problema es que quieren procesar las fechas y no sé cómo interpretar la secuencia de bytes. El tipo me refiero a parece estar dispuesto a aprender, pero hasta ahora no he encontrado nada que entiendo a él para que apunte ...
Código utilicé:
FileOutputStream fos = null;
ObjectOutputStream oos = null;
try
{
fos = new FileOutputStream("t.tmp");
oos = new ObjectOutputStream(fos);
Date today = new Date();
oos.writeLong(today.getTime());
oos.writeObject("Today");
oos.writeObject(today);
oos.close();
}
catch(FileNotFoundException e)
{
e.printStackTrace();
}
catch(IOException e)
{
e.printStackTrace();
}
EDIT:
la salida de la anterior es:
"¬í w ,áqÇ-t Todaysr java.util.DatehjKYt xpw ,áqÇ-x"
el tiempo es "w, áqÇ-" así que lo que es la materia entre el largo y el objeto de la fecha, es decir, "hjKYt XP"
NOTA algunos espacios en blanco son caracteres no imprimibles NULL, SOH, retroceso, etc. Entiendo que es el valor hexadecimal lo que importa.
EDIT:
sigue teniendo problemas. Por alguna razón, la solicitud HTTP serializada no serializa la fecha exactamente como la respuesta que acepté. Muy cerca pero aún diferente y no sé por qué. Lo que es aún más extraño es que cuando simplemente serializo una fecha parece funcionar bien. FYI en worj utilizamos Websphere 6.1 Estos son algunos ejemplos de lo que se envía en la petición:
lr_start_transaction("20000101");
\\x0Ejava.util.Datehj\\x81\\x01KYt\\x19\\x03\\x00\\x00xpw\\x08\\x00\\x00\\x01,\\xE10\\x0BXxt\\x00\\x08
lr_start_transaction("20000102");
\\x0Ejava.util.Datehj\\x81\\x01KYt\\x19\\x03\\x00\\x00xpw\\x08\\x00\\x00\\x01,\\xE10>\\x9Dxt\\x00\\x08
lr_start_transaction("20000103");
\\x0Ejava.util.Datehj\\x81\\x01KYt\\x19\\x03\\x00\\x00xpw\\x08\\x00\\x00\\x01,\\xE10z\\xDBxt\\x00\\x08
he podido identificar la mayoría de los campos, pero no el tiempo real! Por ejemplo la serialVersionUID es hj\\x81\\x01KYt\\x19
EDITAR (FINAL):
me encontré con la fecha pero no está cerca de donde era de esperar! Fue mucho después de la muestra que tenía porque estaban apareciendo otros campos de datos. Pensé que la fecha estaba hecha. ¡Fue solo una casualidad que noté el patrón hexadecimal de la fecha que estaba buscando! Ejemplo:
lr_start_transaction("20000101");
\\x0Ejava.util.Datehj\\x81\\x01KYt\\x19\\x03\\x00\\x00xpw\\x08\\x00\\x00\\x01,\\xE10\\x0BXxt\\x00\\x08OTTST153t\\x00\\x06/Web2/t\\x00\\x044971t\\x00\\x0B12ce12f737d\\x00\\x00\\x01,\\xE10\\x0BXsq\\x00~\\x00\\x0Fw\\x08\\x00\\x00\\x00\\xDCk\\xE2T\\x80xt
¡El valor de la fecha está justo al final!
¿Y los "otros personajes que simplemente no entiendo"? –