[英]Serializing java.util.Date
有誰知道java.util.Date是如何序列化的? 我的意思是向我解釋每個字節到底是什么? 我嘗試寫了一個很長的日期,我可以看到比賽,但還有其他人物,我只是沒有得到。
我們的應用程序使用數據生成服務器請求,這意味着它從客戶端到服務器被序列化 進行壓力測試的團隊使用捕獲這些請求並修改它們的工具,問題是他們想要處理日期而我不知道如何解釋字節流。 我正在談論的家伙似乎願意學習,但到目前為止,我還沒有找到任何我理解的指向他...
我使用的代碼:
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();
}
編輯:
上面的輸出是:
"¬í w ,áqÇ-t Todaysr java.util.DatehjKYt xpw ,áqÇ-x"
長的是“w,áqÇ-”所以long和Date對象之間的東西是什么,即“hjKYt xp”
注意一些空白是不可打印的字符NULL,SOH,退格等。我理解這是重要的十六進制值。
編輯:
還有問題。 由於某種原因,序列化的HTTP請求沒有像我接受的答案那樣序列化日期。 非常接近,但仍然不同,我不知道為什么。 甚至更奇怪的是,當我簡單地序列化一個日期時,似乎工作正常。 在我們使用Websphere 6.1的工作中,以下是請求中發送內容的一些示例:
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
我已經能夠識別大多數字段但不是實際時間! 例如,serialVersionUID是hj\\\\x81\\\\x01KYt\\\\x19
編輯(最終):
我找到了日期,但它沒有在我預期的地方附近! 我的樣本很好,因為其他數據字段出現我認為日期已經完成 - 只是僥幸,我注意到我正在尋找的日期的十六進制模式! 例:
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
日期值正好在最后!
Java對象序列化格式的詳細信息在Java對象序列化規范中指定。 除了魔術和版本號之外, Date
類的詳細信息和對象是Date
的事實被寫入流。
getTime()返回的值被發出(long)。 這表示從1970年1月1日00:00:00 GMT的偏移量,以毫秒為單位。
請注意,它實際上是通過不調用defaultWriteObject
或putFields
破壞規范。
/**
* Save the state of this object to a stream (i.e., serialize it).
*
* @serialData The value returned by <code>getTime()</code>
* is emitted (long). This represents the offset from
* January 1, 1970, 00:00:00 GMT in milliseconds.
*/
private void writeObject(ObjectOutputStream s)
throws IOException
{
s.writeLong(getTimeImpl());
}
因此,它是表示從1970年1月1日00:00:00 GMT的偏移量的長值,以毫秒為單位。
編輯:然而這是一些標題之前和成功:
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.