什么是序列化与反序列化?
- 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 是序列化的对象将要写入的输出流。
- ObjectOutputStream类继承OutputStream 类和实现ObjectOutput 接口。它负责向流写入对象。该类的构造方法如下:
- ObjectInput接口
- ObjectInput 接口继承DataInput接口。它支持对象序列化。特别注意 readObject( )方法,它叫反序列化对象,是从文件里面读取出对象。所有这些方法在出错情况下引发IOException 异常。
- ObjectInput 接口继承DataInput接口。它支持对象序列化。特别注意 readObject( )方法,它叫反序列化对象,是从文件里面读取出对象。所有这些方法在出错情况下引发IOException 异常。
- ObjectInputStream类
- ObjectInputStream 继承InputStream 类并实现ObjectInput 接口。ObjectInputStream 负责从流中读取对象。该类的构造方法如下:
– ObjectInputStream(InputStream inStream) throws IOException,StreamCorruptedException - 参数inStream 是序列化对象将被读取的输入流。
- ObjectInputStream 继承InputStream 类并实现ObjectInput 接口。ObjectInputStream 负责从流中读取对象。该类的构造方法如下:
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();
}
}
}