序列化java.util.Date

序列化java.util.Date,java,serialization,Java,Serialization,有人知道java.util.Date是如何序列化的吗?我的意思是向我解释每个字节到底是什么?我试着写了一个很长的日期,然后我可以看到匹配,但有其他字符,我只是不明白 我们的应用程序使用数据发出服务器请求,这意味着它将从客户端序列化到服务器。进行压力测试的团队使用一个工具捕获并修改这些请求,问题是他们想要处理日期,而我不知道如何解释字节流。和我谈话的那个家伙似乎很愿意学习,但到目前为止,我还没有找到任何我能理解的东西来指给他看 我使用的代码: FileOutputStream fos = nu

有人知道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"
long是“w,áqÇ-”那么long和Date对象之间的内容是什么,即“hjKYt xp”

请注意,有些空格是不可打印的字符NULL、SOH、backspace等。我知道十六进制值很重要

编辑:

仍然有问题。由于某些原因,序列化的HTTP请求没有像我接受的答案所说的那样序列化日期。非常接近,但仍然不同,我不知道为什么。更奇怪的是,当我简单地序列化一个日期时,它似乎工作得很好。仅供参考,在worj,我们使用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
日期值正好在末尾

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

有关Java对象序列化格式的详细信息,请参见。除了magic和版本号之外,
Date
类的详细信息以及对象是
Date
的事实都会写入流中

最重要的是:

getTime()返回的值为 发射(长)。这代表了 自1970年1月1日00:00:00的偏移量 以毫秒为单位的GMT

请注意,它实际上违反了规范,没有调用
defaultWriteObject
putFields

和“我没有得到的其他字符”?