La sérialisation java.util.Date
Personne ne sait comment un java.util.La Date est sérialisée? Je veux dire, expliquez-moi exactement ce que chaque octet est? J'ai essayé d'écrire une longue date et je peux voir les matchs, mais il y a d'autres personnages que je n'ai tout simplement pas l'obtenir.
Notre application fait des demandes de serveur avec les données ce qui signifie qu'il est sérialisée du client vers le serveur. L'équipe qui fait les tests de stress utilise un outil qui rend compte de ces demandes et les modifie, le problème est qu'ils veulent processus dates et je ne sais pas comment interpréter le flux d'octets. Le mec que je parle semble prêt à apprendre, mais jusqu'à présent, je n'ai rien trouvé que je comprends le point de lui...
Code que j'ai utilisé:
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 sortie de la ci-dessus est:
"¬í w ,áqÇ-t Todaysr java.util.DatehjKYt xpw ,áqÇ-x"
Le long est "w ,áqÇ-" alors, quel est le truc entre la longue et la Date de l'objet, c'est à dire "hjKYt xp"
REMARQUE certains les blancs sont des caractères non imprimables NULL, SOH, retour arrière, etc. Je comprends que c'est la valeur hexadécimale qui compte.
EDIT:
Encore avoir des problèmes. Pour une raison quelconque, le sérialisé requête HTTP n'est pas sérialiser la date exactement comme la réponse que j'ai accepté dit. Très proche, mais toujours différents et je ne sais pas pourquoi. Ce qui est encore étrangeté, c'est que quand je sérialiser une date, elle semble bien fonctionner. FYI à worj nous utilisons Websphere 6.1 Voici quelques exemples de ce qui est envoyé dans la requête:
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
J'ai été en mesure d'identifier la plupart des domaines, mais pas le temps réel! E. g le serialVersionUID est hj\\x81\\x01KYt\\x19
MODIFIER (FINALE):
J'ai trouvé la date, mais c'était pas loin d'où j'ai attendu! C'était bien après l'échantillon que j'avais parce que les autres champs de données apparaissaient je pensais que la date a été fait, c'était juste une coup de chance que j'ai remarqué que le modèle hexagonal de la date que je cherchais! Exemple:
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
La date de valeur est à la fin!
OriginalL'auteur BigMac66 | 2010-12-13
Vous devez vous connecter pour publier un commentaire.
donc, c'est le long de la valeur représentant le décalage à partir du 1er janvier 1970 00:00:00 GMT en millisecondes.
EDIT: cependant, ce est précédé et succédé par certains en-têtes:
OriginalL'auteur pstanton
Les détails du format de l'objet Java de la sérialisation sont spécifiés dans Java Sérialisation D'Un Objet De Spécification. Autre que de la magie et les numéros de version , les détails de l'
Date
classe et le fait que l'objet est unDate
est écrit dans le flux.La Doc API pour
Date
sérialisés forme est:Remarque qu'il fait des sauts de la spec en ne demandant pas
defaultWriteObject
ouputFields
.OriginalL'auteur Tom Hawtin - tackline