java 序列化 Serializable 与 反序列化 总结

来源:互联网 发布:酒店前台软件系统 编辑:程序博客网 时间:2024/05/01 16:06

一 、 默认的序列化

一个对象 要能被 序列化,那么他的 类 必须 实现 implements Serializable 接口。


默认 序列化,只 会 序列化 对象 的  成员变量 (transient 修饰符的 除外)。

即  static的变量、所有的方法 都不会 被  序列化。


如果 类 没有  主动地 写 private static final long serialVersionUID = 100000L;  则 默认序列化  会自动生成 一个UID 。


参见代码:

import java.io.Serializable;public class Student implements Serializable {/** *  */private static final long serialVersionUID = 100000L;private String name;  private transient String password;  private static int count=0;     public Student(String name,String password)  {  System.out.println("调用Student的带参的构造方法");  this.name=name;  this.password=password;  count++;  }  public String toString()  {  return "人数: "+count+" 姓名: "+name+" 密码: "+password;  }}package po;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;public class ObjectSerializableTest {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubtry{ FileOutputStream fos=new FileOutputStream("testabc.obj");ObjectOutputStream oos=new ObjectOutputStream(fos); Student s1=new Student("张三","12345");Student s2=new Student("王五","54321");System.out.println(s1);System.out.println(s2); oos.writeObject(s1);oos.writeObject(s2); oos.close(); new Student("xyq","ichedan"); FileInputStream fis=new FileInputStream("testabc.obj");ObjectInputStream ois=new ObjectInputStream(fis);   Student s3=(Student)ois.readObject();Student s4=(Student)ois.readObject();    System.out.println(s3);System.out.println(s4);    ois.close();}catch(IOException e){e.printStackTrace();}catch(ClassNotFoundException e1){e1.printStackTrace();}}}

最终得到的 序列化 后 的文件 如下截图所示:


可见 只序列化了 name属性。

从中可以得出如下结论: 序列化 实际上 保存了以下内容:
1)对象的类型 

2)

serialVersionUID 的值
3)对象 属性的类型  ( 非 static属性)
4)对象 属性的值    (非 static 属性)





上面程序的 输出结果如下所示:


调用Student的带参的构造方法
调用Student的带参的构造方法
人数: 2 姓名: 张三 密码: 12345
人数: 2 姓名: 王五 密码: 54321
调用Student的带参的构造方法
人数: 3 姓名: 张三 密码: null
人数: 3 姓名: 王五 密码: null






二、也可以 自定义  实现 序列化方法。


这样就可以 精确地 控制 序列化 哪些变量。




参考资料:http://blog.csdn.net/wangzhiqing3/article/details/8392820  java 序列化与 反序列化总结

                    http://blog.csdn.net/wangzhiqing3/article/details/8392814   控制对象的 序列化与 反序列化

                    http://www.iteye.com/topic/14707#





0 0
原创粉丝点击