1,最简单,最典型的序列化代码。
附录1中给出的JAVA代码虽然简单,却包含了一个典型的序列化过程中的大部分要点。下面针对该序列化过程中出现的每一个元素进行一一说明。
① 导入Serializable
这是一个不含有任何方法声明的接口类。实现了该接口仅仅是一个标志,标志着该类可以被序列化。关于这个接口需要特别说明的是,为了能够把一个不可以被序列化的类对象(没有实现Serializable,non-serializable classes)的子类序列化,该super class的public域,protected域以及可能被访问到的package域的序列化工作由子类担任。这要求其父类中必须要包含一个没有参数的生成器。
② 关于serialVersionUID
故名思议,这是一个版本号码,而且应该是特定系统中的唯一值。该值用来被反序列化的时候,校验当前被反序列化的对象是不是与当前的类定义版本一致。如果不一致的话,会产生 InvalidClassException异常这样一来,很显然该值应该被定义成 private static final这就可以解释,在使用eclipse定义Serializable对象的时候(类如Servlet),为什么Eclipse会自动生成一个serialVersionUID。
③ 序列化的过程(serialization)
④ 反序列化过程(deserialization)
参见:附录1_最简单的序列化代码
2,实际上,如果项目需要我们也可以完全自定义一个序列化机制。如附录2所示。
参见:附录2_自定义的序列化过程该实例展示了如果将一个对象序列化成可以阅读的xml文档的过程。
附录1中给出的JAVA代码虽然简单,却包含了一个典型的序列化过程中的大部分要点。下面针对该序列化过程中出现的每一个元素进行一一说明。
① 导入Serializable
import java.io.Serializable;
这是一个不含有任何方法声明的接口类。实现了该接口仅仅是一个标志,标志着该类可以被序列化。关于这个接口需要特别说明的是,为了能够把一个不可以被序列化的类对象(没有实现Serializable,non-serializable classes)的子类序列化,该super class的public域,protected域以及可能被访问到的package域的序列化工作由子类担任。这要求其父类中必须要包含一个没有参数的生成器。
② 关于serialVersionUID
private static final long serialVersionUID = 2356129180978015792L;
故名思议,这是一个版本号码,而且应该是特定系统中的唯一值。该值用来被反序列化的时候,校验当前被反序列化的对象是不是与当前的类定义版本一致。如果不一致的话,会产生 InvalidClassException异常这样一来,很显然该值应该被定义成 private static final这就可以解释,在使用eclipse定义Serializable对象的时候(类如Servlet),为什么Eclipse会自动生成一个serialVersionUID。
③ 序列化的过程(serialization)
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(myPerson);
④ 反序列化过程(deserialization)
ObjectInputStream ois = new ObjectInputStream(fis);
Person myPerson = (Person) ois.readObject();
参见:附录1_最简单的序列化代码
2,实际上,如果项目需要我们也可以完全自定义一个序列化机制。如附录2所示。
参见:附录2_自定义的序列化过程该实例展示了如果将一个对象序列化成可以阅读的xml文档的过程。