疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

Java 序列化(Serializable)机制


 

       Java代码

  package com.bjfu.chapter11;

  import java.io.FileInputStream;

  import java.io.FileOutputStream;

  import java.io.IOException;

  import java.io.ObjectInputStream;

  import java.io.ObjectOutputStream;

  import java.io.Serializable;

  public class Box implements Serializable {

  private int width;

  private int height;

  public void setWidth(int width) {

  this.width = width;

  }

  public void setHeight(int height) {

  this.height = height;

  }

  @Override

  public String toString() {

  return "Box [width=" + width + ", height=" + height + "]";

  }

  public void readObjectFromFile() {

  FileInputStream fs = null;

  ObjectInputStream is = null;

  try {

  fs = new FileInputStream("foo.ser");

  is = new ObjectInputStream(fs);

  //每次调用readObject 都会从流出读出一个对象。

  //读取顺序与写入顺序相同。

  Box b = (Box) is.readObject();

  System.out.println(b);

  b = (Box) is.readObject();

  System.out.println(b);

  } catch (Exception e) {

  e.printStackTrace();

  } finally {

  try {

  is.close();

  fs.close();

  } catch (Exception e) {

  e.printStackTrace();

  }

  }

  }

  public static void main(String[] args) {

  Box box = new Box();

  box.setWidth(50);

  box.setHeight(20);

  Box box1 = new Box();

  box1.setWidth(100);

  box1.setHeight(50);

  FileOutputStream fs = null;

  ObjectOutputStream os = null;

  try {

  fs = new FileOutputStream("foo.ser");

  os = new ObjectOutputStream(fs);

  //每次调用writeObject 都会向流出写入一个对象。

  os.writeObject(box);

  os.writeObject(box1);

  } catch (Exception e) {

  e.printStackTrace();

  } finally {

  try {

  os.close();

  fs.close();

  } catch (IOException e) {

  e.printStackTrace();

  }

  }

  new Box().readObjectFromFile();

  }

  }

  10. 序列化,将被序列化的对象写到文件中,然后就可以让你的程序去文件中读取序列化的对象并把它们展开到活生生的状态。

  11. 将串流(stream)连接起来代表来源于目的地(文件或网络端口)的连接。串流必须要连接到某处才能算是个串流。

  对象被序列化的时候发生了什么?在堆上的对象有状态-实例变量的值。这些值让同一类的不同实例有不同的意义。

  序列化的对象保存了实例变量的值,因此之后可以在堆上带回一模一样的实例。

  当对象还带有对其他对象的引用怎么办?

  当对象被序列化时,被该对象引用的实例变量也会被序列化。且所有被引用的对象也会被序列化。最棒的是,这些操作都是自动进行的。

  12. 如果要让类能够被序列化,就要实现 serializable 接口。序列化接口没有方法或字段,仅用于标识可序列化的语义。

  13. 序列化是全有或全无的。不能够只有部分状态被正确保存下来。

  14. 如果某实例变量不能或不应该被序列化,就把它标记为 transient (瞬时的)。

  class Chat implements Serializable {

  transient String currentID;

  String userName;

  //......

  }

  15. 如果两个对象都有引用实例变量指向相同的对象会怎样?例如两个Cat 都有相同的 Owner 对象,Owner对象会被存储两次吗?

  序列化能够分辨两个对象是否相同。在此情况下,只有一个对象会被存储,其他引用会被复原成指向该对象。

  16. 解序列化(Deserialization)时,如果找不到或无法加载被解的类时,Java 虚拟机会抛出异常。

  17. 如果对象在继承树上有个不可序列化的祖先类,则该不可序列化类及在它之上的类的构造函数(就算是可序列化的也一样)就会执行。一旦构造函数连锁启动之后将无法停止。也就是说,从第一个不可序列化的父类开始,全部都会重新初始状态。

  18. 静态变量不会被序列化,当对象被还原的时候,静态变量会维持类中原本的样子,而不是存储时的样子。

  19. 如果父类实现序列化,则子类也就自动地有实现,而不管是否有明确的声明。 

  疯狂软件学院专注高级软件编程,每年都向社会输送大量IT业的优秀人才,赢得了各大企事业单位的广泛赞誉。疯狂Java拥有技术深厚的教师团队授课,让学员充分感受Java的魅力,充分激发每个学员对于编程的热爱,让你在半年时间掌握将近8-10万的代码量,成为技术达人,现在只要参加疯狂Java培训(疯狂软件学院官网http://www.fkjava.org/抢座热线:020-28309358 ,020-28309378咨询QQ:707552864 ,544627560)的专业培训,在很短的几个月时间,你就能基本掌握Java的核心技术,配合疯狂Java专业教材,企业全真模拟开发训练,迅速积累项目经验。让学员迅速获得其他人需要花费两年才能获得的工作技能,很快就能入名企拿高薪。