深入理解Java对象序列化

发表于:2012-2-15 09:31

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:Sha Jiang    来源:51Testing软件测试网采编

  关于Java序列化的文章早已是汗牛充栋了,本文是对我个人过往学习,理解及应用Java序列化的一个总结。此文内容涉及Java序列化的基本原理,以及多种方法对序列化形式进行定制。在撰写本文时,既参考了Thinking in Java, Effective Java,JavaWorld,developerWorks中的相关文章和其它网络资料,也加入了自己的实践经验与理解,文、码并茂,希望对大家有所帮助。(持续更新中,2012.02.13最后更新)

  1、什么是Java对象序列化

  Java平台允许我们在内存中创建可复用的Java对象,但一般情况下,只有当JVM处于运行时,这些对象才可能存在,即,这些对象的生命周期不会比JVM的生命周期更长。但在现实应用中,就可能要求在JVM停止运行之后能够保存(持久化)指定的对象,并在将来重新读取被保存的对象。Java对象序列化就能够帮助我们实现该功能。

  使用Java对象序列化,在保存对象时,会把其状态保存为一组字节,在未来,再将这些字节组装成对象。必须注意地是,对象序列化保存的是对象的"状态",即它的成员变量。由此可知,对象序列化不会关注类中的静态变量。

  除了在持久化对象时会用到对象序列化之外,当使用RMI(远程方法调用),或在网络中传递对象时,都会用到对象序列化。Java序列化API为处理对象序列化提供了一个标准机制,该API简单易用,在本文的后续章节中将会陆续讲到。

  2、简单示例

  在Java中,只要一个类实现了java.io.Serializable接口,那么它就可以被序列化。此处将创建一个可序列化的类Person,本文中的所有示例将围绕着该类或其修改版。

  Gender类,是一个枚举类型,表示性别

  1. public enum Gender {  
  2.     MALE, FEMALE  
  3. }

  如果熟悉Java枚举类型的话,应该知道每个枚举类型都会默认继承类java.lang.Enum,而该类实现了Serializable接口,所以枚举类型对象都是默认可以被序列化的。

  Person类,实现了Serializable接口,它包含三个字段:name,String类型;age,Integer类型;gender,Gender类型。另外,还重写该类的toString()方法,以方便打印Person实例中的内容。

  1. public class Person implements Serializable {  
  2.     private String name = null;  
  3.     private Integer age = null;  
  4.     private Gender gender = null;  
  5.     public Person() {  
  6.         System.out.println("none-arg constructor");  
  7.     }  
  8.     public Person(String name, Integer age, Gender gender) {  
  9.         System.out.println("arg constructor");  
  10.         this.name = name;  
  11.         this.age = age;  
  12.         this.gender = gender;  
  13.     }  
  14.     public String getName() {  
  15.         return name;  
  16.     }  
  17.     public void setName(String name) {  
  18.         this.name = name;  
  19.     }  
  20.     public Integer getAge() {  
  21.         return age;  
  22.     }  
  23.     public void setAge(Integer age) {  
  24.         this.age = age;  
  25.     }  
  26.     public Gender getGender() {  
  27.         return gender;  
  28.     }  
  29.     public void setGender(Gender gender) {  
  30.         this.gender = gender;  
  31.     }  
  32.     @Override 
  33.     public String toString() {  
  34.         return "[" + name + ", " + age + ", " + gender + "]";  
  35.     }  
  36. }

51/512345>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号