Java序列化基础

本文将简介Java序列化和反序列化的概念,并且提供一个简单类的序列化和反序列化实现。

概念

序列化:将实例的结构和数据保存到文件、网络等目的地的过程叫做序列化。

持久化和序列化的区别:持久化和序列化都是指将瞬时的实例结构及其数据存储到一个目的地,但是持久化的目的地是文件或者数据库等持久的,相对持久化来说,序列化的目的地不一定是持久的。

使用场景

1.  网络数据传输,使用ajax请求服务器数据,服务器端一般会将数据实例序列化为xml或者json返回给浏览器,使用js接收到序列化后的数据字符串,然后转为js对象使用。

2.  网络编程中将实例序列化通过sockt传递给接受者,然后接受者反序列化后得到对象,然后使用。

实现简单的序列化和反序列化

本例将java实例序列化到文件,然后读取文件反序列化得到对象实例。在本例中需要注意以下几点:

1.  被序列化的类必须实现 java.io.Serializable 接口,此接口是一个标记接口,并没有待实现的方法。

2.  静态成员不会被序列化。

3.  被transient关键字修饰的成员不会被序列化。

4.  将多个实例序列化到一个目标(在此例中目的地为文件)时,反序列化读对象的顺序应该和序列化写的顺序是相同的。比如有三个实例a、b、c,他们序列化的顺序为a、b、c,那么反序列化时,最先读到的对象实例是a、最后读到的实例为c。

5.  目标文件是一个二进制文件,而不是文本文件。

案例

[java] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. import java.io.Serializable;  
  2.   
  3. /** 
  4.  * Created by yanwushu on 2016/7/18. */  
  5. public class Cat implements Serializable{  
  6.   
  7.     private static String TEMP = "this is a test string";//静态成员不会被序列化  
  8.   
  9.     private String name;  
  10.     private transient int age;//transient修饰符修饰的成员不会被序列化  
  11.   
  12.     public Cat(String name, int age) {  
  13.         this.name = name;  
  14.         this.age = age;  
  15.     }  
  16.   
  17.     public String getName() {  
  18.         return name;  
  19.     }  
  20.   
  21.     public void setName(String name) {  
  22.         this.name = name;  
  23.     }  
  24.   
  25.     public int getAge() {  
  26.         return age;  
  27.     }  
  28.   
  29.     public void setAge(int age) {  
  30.         this.age = age;  
  31.     }  
  32.   
  33.     @Override  
  34.     public String toString() {  
  35.         return "Cat{" +  
  36.                 "temp ="+TEMP+  
  37.                 "name='" + name + '\'' +  
  38.                 ", age=" + age +  
  39.                 '}';  
  40.     }  
  41. }  
  42.   
  43. package org.yanwushu.serialize.example;  
  44.   
  45. import org.junit.Test;  
  46.   
  47. import java.io.*;  
  48.   
  49. /** 
  50.  * Created by yanwushu on 2016/7/18. 
  51.  */  
  52. public class TestClass {  
  53.   
  54.     //简单的类序列化  
  55.     @Test  
  56.     public void serializeTest(){  
  57.         Cat c = new Cat("kitty" , 2);  
  58.         try {  
  59.             FileOutputStream fos = new FileOutputStream("cat.yanwushu");  
  60.             ObjectOutputStream oos = new ObjectOutputStream(fos);  
  61.             oos.writeObject(c);  
  62.             oos.flush();  
  63.             oos.close();  
  64.             System.out.println("cat serialized completed:" + c.toString());  
  65.         } catch (FileNotFoundException e) {  
  66.             e.printStackTrace();  
  67.         } catch (IOException e) {  
  68.             e.printStackTrace();  
  69.         }  
  70.     }  
  71.   
  72.     //简单的类反序列化  
  73.     @Test  
  74.     public void deserializeTest(){  
  75.         try {  
  76.             FileInputStream fis = new FileInputStream("cat.yanwushu");  
  77.             ObjectInputStream ois = new ObjectInputStream(fis);  
  78.             Cat c = (Cat) ois.readObject();  
  79.             ois.close();  
  80.             System.out.println("cat deserialize completed , and the content is :"+c.toString());  
  81.         } catch (IOException e) {  
  82.             e.printStackTrace();  
  83.         } catch (ClassNotFoundException e) {  
  84.             e.printStackTrace();  
  85.         }  
  86.     }  
  87. }  
posted @ 2016-11-24 17:19  天涯海角路  阅读(85)  评论(0)    收藏  举报