java对象的序列化和反序列化

java串行化技术可以将一个java对象的状态写入byte流(序列化),保持对象的持久化,便于存储和传输;并可以将byte反序列化重构为一个java对象(这个过程不会调用构造器)。这种机制允许你将对象在网络上进行传输,并可以随时把对象持久化到数据库或文件系统中。java的串行机制是RMI\EJB的基础。用途:利用对象的串行化实现保存应用程序的当前工作状态,下次再启动的时候将自动地恢复到上次执行的状态。

1、 要让一个类的对象实例内容能被序列化,首先该类要继承java.io.Serializable.如:

public class Person  implements  java.io.Serializable{
private  String  name;
private  int age;
public  Person (String name,  int  age){

System.out.println("这是有参数的构造器");
this.name = name;
this.age = age;
}

.......此处省略get、set方法

}

2、用处理流ObjectOutputStream中的writeObject()方法负责将类的实例状态写入输出流,代码如下:

public  static  void  main(String [] args)  throws  Exception{
 ObjectOutputStream  oos = new ObjectOutputStream(  new  FileOutputStream("E://object.txt"));
 Person  p = new Person("牛逼闪闪的青青小丸子", 26);
      oos.writeObject(p);
  }

3、用ObjectInputStream对象的ReadObject()方法读输入流中的对象,返回一个Object类型,可以强制转换为真正的对象类型,反序列化机制无需通过调用构造器来初始化java对象(因为反序列化Person对象的时候,没有看到程序调用该构造器而执行打印语句)。代码如下:

public  static  void  main(String [] args)  throws  Exception{
 ObjectInputStream  oos = new ObjectInputStream(  new  FileInputStream("E://object.txt"));
 Person  p = (Person)oos.readObject();
     System.out.println(p.getName());
     System.out.println(p.getAge());
 }

4、声明为statictransient类型的成员数据不能被串行化。因为static代表类的状态, transient代表对象的临时数据;transient关键字修饰Field,可以将该Field完全隔离在序列化之外。特定的情景需要,比如银行账户信息不需要序列化;

5、 WriteObject()和ReadObject()方法可以重写,便于改变序列化和反序列化机制,如在序列化过程中将对象的内容进行加密,反序列化对对象的内容解密。

注意:反序列化读取的仅仅是java对象的数据,而不是java类,因此采用反序列化恢复java对象时候,必须提供java对象所属的class文件,否则会引起ClassNotFoundException异常。





posted @ 2014-03-20 12:43  飞扬的薰衣草  阅读(139)  评论(0)    收藏  举报