2010-12-13 22 views
8

Weiß jemand, wie ein java.util.Date serialisiert wird? Ich meine, erklären Sie mir genau, was jedes Byte ist? Ich habe versucht, ein langes und ein Datum zu schreiben, und ich kann Matches sehen, aber es gibt andere Charaktere, die ich einfach nicht bekomme.Serialisierung java.util.Date

Unsere Anwendung macht Server-Anfragen mit Daten, was bedeutet, dass es von Client zu Server serialisiert wird. Das Team, das Stresstests durchführt, verwendet ein Tool, das diese Anforderungen erfasst und modifiziert, das Problem ist, dass sie Daten verarbeiten möchten und ich nicht weiß, wie der Byte-Stream zu interpretieren ist. Der Typ ich spreche zu scheint bereit zu lernen, aber bisher habe ich nichts gefunden, das verstehe ich ihn Punkt zu ...

Code I verwendet:

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:

die Ausgabe aus dem oben ist:

"¬í w ,áqÇ-t Todaysr java.util.DatehjKYt xpw ,áqÇ-x" 

die lange ist „w, áqÇ-“ so was ist der Stoff, zwischen dem langen und dem Date-Objekt, das heißt „hjKYt xp“

HINWEIS einige der Leerzeichen sind nicht druckbare Zeichen NULL, SOH, Rücktaste usw. Ich verstehe, dass es der Hex-Wert ist, der zählt.

EDIT:

Immer noch Probleme. Aus irgendeinem Grund serialisiert die serialisierte HTTP-Anfrage das Datum nicht genau wie die Antwort, die ich akzeptierte. Sehr nah, aber immer noch anders und ich weiß nicht warum. Was noch seltsamer ist, wenn ich ein Datum einfach serialisiere, scheint es gut zu funktionieren. Zu Ihrer Information bei worj verwenden wir Websphere 6.1 Hier einige Beispiele von dem, was in der Anfrage gesendet wird:

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 

konnte ich die meisten Felder identifizieren, aber nicht die tatsächliche Zeit! die serialVersionUID z.B ist hj\\x81\\x01KYt\\x19

EDIT (FINAL):

ich das Datum gefunden, aber es war nicht annähernd, wo ich es erwartet hatte! Es war gut nach der Probe, die ich hatte, weil andere Datenfelder auftauchten. Ich dachte, dass das Datum fertig war - es war nur Zufall, dass ich das hexadezimale Muster des Datums bemerkte, nach dem ich suchte! Beispiel:

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 

Der Datumswert ist genau am Ende!

Antwort

5

daher ist es der lange Wert, der den Offset vom 1. Januar 1970 00:00:00 GMT in Millisekunden darstellt.

EDIT: aber diese vorausgegangen ist und es gelang ihm durch einige Header:

0x73 - being the code for an ordinary object (TC_OBJECT)  
0x72 - being the code for a class description (TC_CLASSDESC)  
"java.util.Date" - the name of the class  
7523967970034938905L - the serialVersionUID  
0|0x02|0x01 - flags including SC_SERIALIZABLE & SC_WRITE_METHOD  
0 - number of fields  
0x78 - TC_ENDBLOCKDATA  
null - there is no superclass descriptor  
the time (long milliseconds since epoch)  
0x78 - TC_ENDBLOCKDATA 
+0

Und die "anderen Charaktere, die ich gerade nicht bekomme"? –

8

Die Einzelheiten des Formats von Java-Objekt-Serialisierung in Java Object Serialization Specification angegeben. Anders als Zauber- und Versionsnummern werden Details der Klasse Date und die Tatsache, dass das Objekt ein Date ist, in den Stream geschrieben.

Die API doc for Date serialised form ist:

Der zurückgegebene Wert von getTime() ist emittiert (lang). Dies stellt den Offset vom 1. Januar 1970, 00:00:00 GMT in Millisekunden dar.

Beachten Sie, dass es tatsächlich die Spezifikation bricht durch nicht defaultWriteObject oder putFields aufrufen.

Verwandte Themen