簡體   English   中英

序列化java.util.Date

[英]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的事實被寫入流。

Date序列化表單API文檔是:

getTime()返回的值被發出(long)。 這表示從1970年1月1日00:00:00 GMT的偏移量,以毫秒為單位。

請注意,它實際上是通過不調用defaultWriteObjectputFields破壞規范。

/**
 * 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM