Java序列化算法原理

Java序列化算法原理

1、什么是java序列化

Java 序列化 API 提供一种处理对象序列化的标准机制。序列化Serialization是指将java对象用一连串字节描述的一个过程;反序列化deserialization是一种将这一串字节构建成一个对象的过程。


2、序列化的作用(必要性)

Java中,一切都是对象,在分布式环境中经常需要将对象从这一端网络或设备传递到另一端。Java 序列化机制就是一种解决在网络两端传输数据的问题而产生的协议。下图表示客户端/服务器之间通信,一个对象是从客户端传送到服务器通过序列化的视图。


3、如何序列化一个对象

为序列化一个对象,你需确保对象类实现Serializable接口。Serializable接口没有方法,只要实现了序列化接口,Class 就能被序列化机制处理。

示例代码,需序列化的java对象:

1  import  java.io.Serializable;
2 
3  public   class  TestClassSerial  implements  Serializable  {
4       public   byte  version  =   100 ;
5       public   byte  count  =   0 ;  
6  }

示例代码, TestClassSerial对照象 输出成 Byte 流, 存储到 temp.out 文件里:
 1       public   static   void  main(String args[])  throws  IOException {
 2          FileOutputStream fos  =   null ;
 3          ObjectOutputStream oos  =   null ;
 4           try  {
 5              fos  =   new  FileOutputStream( " c:/temp.out " );
 6              oos  =   new  ObjectOutputStream(fos);
 7              TestClassSerial tcs  =   new  TestClassSerial();
 8              oos.writeObject(tcs);
 9              oos.flush();
10          }
11           finally  {
12               if (oos  !=   null ) {
13                  oos.close();
14              }
15               if (fos  !=   null ) {
16                  fos.close();
17              }
18          }
19      }

示例代码, 从持久的文件中读取 Bytes 重建对象
 1       public   static   void  main1(String args[])  throws  IOException {
 2          FileInputStream fis  =   null
 3          ObjectInputStream oin  =   null ;
 4           try  {
 5              fis  =   new  FileInputStream( " c:/temp.out " );
 6              oin  =   new  ObjectInputStream(fis);
 7              TestClassSerial tcs  =  (TestClassSerial) oin.readObject();
 8              System.out.println( " version= " + tcs.version);
 9          }
10           finally  {
11               if (fis  !=   null ) {
12                  fis.close();
13              }
14               if (oin  !=   null ) {
15                  oin.close();
16              }
17          }
18      }

执行结果为:100.


4、对象的序列化格式

TestClassSerial对象序列化输出的 temp.out 文件,以 16 进制方式显示,内容如下:

AC ED  00   05   73   72   00  0A  53   65   72   69   61  6C  54   65
73   74  A0 0C  34   00  FE B1 DD F9  02   00   02   42   00   05
63  6F  75  6E  74   42   00   07   76   65   72   73   69  6F 6E  78
70   00   64

这些二进制字节就是用来描述序列化以后的TestClassSerial对象的,我们注意到 TestSerial 类中只有两个域:

1  public    byte  version  =   100 ;
2  public   byte  count  =   0 ;

都是 byte 型,理论上存储这两个域只需要 2 byte ,但是实际上 temp.out 占据空间为 51bytes ,也就是说除了数据以外,还包括了对序列化对象的其他描述。


5、Java 的序列化算法

序列化算法一般会按步骤做如下事情:

1、将对象实例相关的类的元数据输出;
2、
递归地输出类的超类元数据描述直到不再有超类;
3、
类元数据完了以后,开始从最顶层的超类开始输出对象实例的实际数据值;
4、
从上至下递归输出实例的数据;


更多序例化事例及二进制字节含义参考文档:http://my.oschina.net/god/blog/1291

你可能感兴趣的:(Java序列化算法原理)