Java序列化

先看一段代码:

  1. package test;
  2.  
  3. import java.io.*;
  4.  
  5. class UtilTool{
  6.     // 序列化对象 object
  7.     public static byte[] enSerializable(Object object) {
  8.         ByteArrayOutputStream byteOutputStream  = new ByteArrayOutputStream();
  9.         ObjectOutputStream objectOutputSteam = null;
  10.         try {
  11.             objectOutputSteam = new ObjectOutputStream(byteOutputStream);
  12.             objectOutputSteam.writeObject(object);
  13.             objectOutputSteam.close();
  14.         } catch(Exception e){
  15.             e.printStackTrace();
  16.         }
  17.          return byteOutputStream.toByteArray();
  18.     }
  19.     // 反序列化 bytes
  20.     public static Object deSerializable(byte[] bytes) {
  21.         ByteArrayInputStream byteInputStream  = new ByteArrayInputStream(bytes);
  22.         ObjectInputStream objectInputStream = null;
  23.         Object object = null;
  24.         try {
  25.             objectInputStream = new ObjectInputStream(byteInputStream);
  26.             object =  objectInputStream.readObject();
  27.             objectInputStream.close();
  28.         }catch(Exception e){
  29.             e.printStackTrace();
  30.         }
  31.         return object;
  32.     }
  33.  
  34. }
  35.  
  36. class Cat implements Serializable {
  37.     private static final long serialVersionUID = 1L;
  38.    
  39.     private String name;
  40.     public Cat(){
  41.     }
  42.     public String getName() {
  43.         return name;
  44.     }
  45.    
  46.     public void setName(String name) {
  47.         this.name = name;
  48.     }
  49. }
  50. class Hello{
  51.     public static void main(String[] args){
  52.         Cat cat = new Cat();
  53.         cat.setName("kitty");
  54.        
  55.         byte[] bytes = UtilTool.enSerializable(cat);
  56.         cat = (Cat)UtilTool.deSerializable(bytes);
  57.        
  58.         System.out.println(cat.getName());
  59.     }
  60.    
  61. }

代码说明:

  1. 一个类只要实现 Serializable 接口,Java 就认为其可以序列化(和反序列化);而实际上该接口么有任何字段定义和方法声明,只是一种指示 or 标志而已;
  2. 如果一个类 A 序列化了,那么其子类 B 默认也是序列化的;
  3. 如果类 B 继承自类 A, A 没有序列化, B 序列化了, 那么 A 必须得有默认构造函数(不带参数的构造函数),否则反序列化会失败;
  4. serialVersionUID 字段不是必需的, 如果程序中不指定系统也会自动生成;因为其用于反序列化,是一种版本标识,所以建议不要随便修改其值,还有就是最好程序中指定(系统默认生成的可能因为底层系统不一样而生成的不一致);serialVersionUID 不一致反序列化会抛 InvalidClassException 异常;
  5. 声明为 static 和 transient 类型的成员数据不能序列化;

Tags: 

Article type: