Serializable接口

来源:互联网 发布:清华ubuntu源 编辑:程序博客网 时间:2024/05/01 01:23

12.16  对象序列化

12.16.1  基本概念与Serializable接口

对象序列化就是把一个对象变为二进制的数据流的一种方法,如图12-30所示。通过对象序列化可以方便地实现对象的传输或存储。

 (点击查看大图)图12-30  对象转换为二进制数据如果一个类的对象想被序列化,则对象所在的类必须实现java.io.Serializable接口。此接口的定义如下:
  1. public interface Serializable{} 

可以发现在此接口中并没有定义任何的方法,所以此接口是一个标识接口。表示一个类具备了被序列化的能力。

范例:定义可序列化的类

  1. package org.lxh.demo12.serdemo;  
  2. import java.io.Serializable;  
  3. public class Person implements Serializable {
    // 此类的对象可以被序列化  
  4.     private String name;                     
    // 声明name属性  
  5.     private int age;                         
    // 声明age属性  
  6.     public Person(String name, int age) {   
    // 通过构造方法设置属性内容  
  7.         this.name = name;  
  8.         this.age = age;  
  9.     }  
  10.     public String toString() {                
    // 覆写toString()方法  
  11.         return "姓名:" + this.name + ";
    年龄:"
     + this.age;  
  12.     }  

以上的Person类已经实现了序列化接口,所以此类的对象是可以经过二进制数据流进行传输的。而如果要完成对象的输入或输出,还必须依靠对象输出流(ObjectOutputStream)和对象输入流(ObjectInputStream)。

使用对象输出流输出序列化对象的步骤有时也称为序列化,而使用对象输入流读入对象的过程有时也称为反序列化,如图12-31所示。

 (点击查看大图)图12-31  对象的序列化和反序列化过程

U提示:对象序列化和对象反序列化操作时的版本兼容性问题。

在对象进行序列化或反序列化操作时,要考虑JDK版本的问题。如果序列化的JDK版本和反序列化的JDK版本不统一则就有可能造成异常,所以在序列化操作中引入了一个serialVersionUID的常量,可以通过此常量来验证版本的一致性。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体(类)的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常。

当实现java.io.Serializable接口的实体(类)没有显式地定义一个名为serialVersionUID、类型为long的变量时,Java序列化机制在编译时会自动生成一个此版本的serialVersionUID。当然,如果不希望通过编译来自动生成,也可以直接显式地定义一个名为serialVersionUID、类型为long的变量,只要不修改这个变量值的序列化实体,都可以相互进行串行化和反串行化。

本程序中直接在Person中加入以下的常量即可:

  1. private static final long serialVersionUID = 1L; 

serialVersionUID的具体内容由用户指定。