Java对象的序列化与反序列化

来源:互联网 发布:淘宝上的aj是正品吗 编辑:程序博客网 时间:2024/05/16 14:08
什么是序列化与反序列化?
  • java虚拟机new出的对象存储在内存中,序列化就是将对象转换为字节流的过程,写入到文件中保存起来或通过网络传输。反序列化是将字节流读取后转换成序列化之前的对象。
  • 举个例子:定义了一个person类,其中类里面有姓名 String name,性别 String sex,年龄 int age等成员变量。new出一个对象后赋予对象相关属性,但是这个属性是在内存中保存的,java JVM(虚拟机)关闭后这个对象就会消失,那么如何将该对象保存呢?即使用序列化将对象转换成字节流再写入到文件中,再次启动JVM后,可以通过反序列化将字节流转换为对象,该对象具有序列化之前的所有非静态变量的属性,即person中的name,sex,age属性不变。

如何进行序列化、反序列化?

  • java实现序列化的过程比较简单,通常不需要编写保存或恢复对象的过程代码,实现java.io.Serializable接口的类的对象就可以转换字节流或者从字节流中恢复,不需要在类里面实现任何代码。
  • Serializable接口没有定义任何成员,只是表示一个类可以被序列化。
  • 当一个对象被序列化时,只保存对象的非静态成员变量,不保存任何方法和静态成员变量。
  • 如果一个对象的成员变量是另一个类的对象,那么这个对象的数据也会被保存。
  • 声明成transient的变量不会被序列化存储。
  • 如果对象中包含的对象的引用是不可序列化的,那么序列化会失败,抛出NotSerializable异常。

序列化、反序列化相关接口和类

  • ObjectOutput接口
    • ObjectOutput接口继承DataOutput接口并支持对象序列化,其中writeObject()方法的作用为序列化一个对象,可以讲对象放入文件里。
    • 出错引发IOException
  • ObjectOutputStream类 
    • ObjectOutputStream类继承OutputStream 类和实现ObjectOutput 接口。它负责向流写入对象。该类的构造方法如下: 
      –ObjectOutputStream(OutputStream outStream) throws IOException 
    • 参数outStream 是序列化的对象将要写入的输出流。
  • ObjectInput接口
    • ObjectInput 接口继承DataInput接口。它支持对象序列化。特别注意 readObject( )方法,它叫反序列化对象,是从文件里面读取出对象。所有这些方法在出错情况下引发IOException 异常。
  • ObjectInputStream类
    •  ObjectInputStream 继承InputStream 类并实现ObjectInput 接口。ObjectInputStream 负责从流中读取对象。该类的构造方法如下: 
      – ObjectInputStream(InputStream inStream) throws IOException,StreamCorruptedException
    • 参数inStream 是序列化对象将被读取的输入流。
import java.io.Serializable;public class person implements Serializable {public String name;public String sex;public int age;public void sayhello() {System.out.println(this.name + " say hello");}public void sayall() {System.out.println(this.name + " " + this.sex + " " + this.age);}public person(String name, String sex, int age) {this.name = name;this.sex = sex;this.age = age;}}

import java.io.*;public class SerializeDemo {public static void main(String[] args) {person np1 = new person("prime7", "nan", 22);try {FileOutputStream fos = new FileOutputStream("person.txt");ObjectOutputStream oos = new ObjectOutputStream(fos);oos.writeObject(np1);oos.flush();oos.close();} catch (Exception ex) {ex.printStackTrace();}np1.sayhello();person np2 = null;try {FileInputStream fis = new FileInputStream("person.txt");ObjectInputStream ois = new ObjectInputStream(fis);np2 = (person) ois.readObject();np2.sayall();ois.close();} catch (Exception ex) {ex.printStackTrace();}}}


0 0
原创粉丝点击