深入Serializable

来源:互联网 发布:农村淘宝合伙人不干了 编辑:程序博客网 时间:2024/05/29 08:26
  • Java的Serializable

    Serialization(序列化)是一种将对象以一连串的字节描述的过程;反序列化deserialization是一种将这些字节重建成一个对象的过程。Java序列化API提供一种处理对象序列化的标准机制。在这里你能学到如何序列化一个对象,什么时候需要序列化以及Java序列化的算法,我们用一个实例来示范序列化以后的字节是如何描述一个对象的信息的。

    说白了,Java都是通过对象来描述实体,而对象是不能再网络上传递的,如果将对象生成一种可以解析的"一连串的字节描述",那么对象的数据就可以在网络上进行传递了。


    对象序列化后,会生成一个.out结尾的文件,这个文件用16进制打开就像下面的一样:

    [java] view plain copy
    1. AC ED 00 05 73 72 00 0A 53 65 72 69 61 6C 54 65  
    2.   
    3. 73 74 A0 0C 34 00 FE B1 DD F9 02 00 02 42 00 05  
    4.   
    5. 63 6F 75 6E 74 42 00 07 76 65 72 73 69 6F 6E 78  
    6.   
    7. 70 00 64  

  • 一个Java的Serializable实例:

    1. Java的对象需要序列化,数据结构对象就需要实现Serializable接口,例如以下代码:

      [java] view plain copy
      1. /** 
      2.  * guest_book 数据结构 
      3.  * @author zhuli 
      4.  */  
      5. public class GuestbookDo implements Serializable{ //implements Serializable是关键  
      6.       
      7.     private String title;  
      8.       
      9.     private String content;  
      10.       
      11.     private String username;  
      12.       
      13.     private int id;  
      14.       
      15.       
      16.     public int getId() {  
      17.         return id;  
      18.     }  
      19.   
      20.     public void setId(int id) {  
      21.         this.id = id;  
      22.     }  
      23.   
      24.     public String getTitle() {  
      25.         return title;  
      26.     }  
      27.   
      28.     public void setTitle(String title) {  
      29.         this.title = title;  
      30.     }  
      31.   
      32.     public String getContent() {  
      33.         return content;  
      34.     }  
      35.   
      36.     public void setContent(String content) {  
      37.         this.content = content;  
      38.     }  
      39.   
      40.     public String getUsername() {  
      41.         return username;  
      42.     }  
      43.   
      44.     public void setUsername(String username) {  
      45.         this.username = username;  
      46.     }  
      47.   
      48.     public int getDtime() {  
      49.         return dtime;  
      50.     }  
      51.   
      52.     public void setDtime(int dtime) {  
      53.         this.dtime = dtime;  
      54.     }  
      55.   
      56.     private int dtime;  
      57. }  

    2. 我们通过数据流的方式,将GuestbookDo对象进行序列化,写进数据流。并且在web目录下会生成temps.out,就是一个序列化的对象的数据流文件。通过url中的http://xxxx/test/test/访问,就能将对象写入数据流了。

      [java] view plain copy
      1. @RequestMapping(value="/test")  
      2. @ResponseBody  
      3. public String test() throws IOException {  
      4.       //对象实例化  
      5.       GuestbookDo gb = new GuestbookDo();  
      6.       gb.setContent("asdasd");  
      7.       gb.setId(100);  
      8.       //数据流  
      9.       FileOutputStream fos = new FileOutputStream("temps.out");    
      10.       ObjectOutputStream oos = new ObjectOutputStream(fos);    
      11.       oos.writeObject(gb);    
      12.       oos.flush();    
      13.       oos.close();    
      14.     return "test";  
      15. }  



    3. 我们可以通过读取temps.out的方法就能读取到这个数据流中的对象结构。

      [java] view plain copy
      1. @RequestMapping(value="/testa")  
      2. @ResponseBody  
      3. public String testa() throws Exception {  
      4.       InputStream is=new FileInputStream("temps.out");  
      5.   
      6.   
      7.        ObjectInputStream ois=new ObjectInputStream(is);  
      8.   
      9.      GuestbookDo gb = (GuestbookDo) ois.readObject();  
      10.    
      11.        System.out.println("id="+gb.getId());    
      12.        System.out.println("content="+gb.getContent());    
      13.        ois.close();  
      14.     return "test1";  
      15. }  

      结果:



  • 序列化算法一般会按步骤

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