有时我们需要保存对象,以便进一步地操作,这便用到了对象序列化。
对象序列化基本概念
所谓的对象序列化(串行化),是指在内存中保存的对象转化为二进制数据流的形式的一种操作。通过将对象序列化,可以方便地实现对象的传输及保存。 但是在java之中并不是所有的类的对象都可以被序列化,如果一个类对象需要被序列化,则此类一定要实现java.io.Serializable接口。但是这个接口里面没有定义任何的方法,所以此接口依然属于标识接口,表示一种能力。
在java中提供有ObjectInputStream和ObjectOutputStream这两个类用于序列化对象的操作,它们是用于存储和读取对象的输入输出流类,帮助开发者完成保存和读取对象成员变量取值的过程,但要求读写或存储的对象必须实现了Serialized接口。
对象序列化使用范例:
package test;
import java.io.Serializable;
public class Student implements Serializable{
private String name;
private int age;
public Student(String name,int age){
this.name=name;
this.age=age;
}
@Override
public String toString() {
return "姓名=" + name + ", 年龄=" + age ;
}
}
package test;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
public class SerializableDemo {
public static void main(String[] args) throws Exception {
File f=new File("SerializedStudent");
serialize(f);
deserialize(f);
}
public static void serialize(File f) throws Exception{
OutputStream outputFile=new FileOutputStream(f);
ObjectOutputStream cout=new ObjectOutputStream(outputFile);
cout.writeObject(new Student("张三",25));
cout.close();
}
public static void deserialize(File f) throws Exception{
InputStream inputFile=new FileInputStream(f);
ObjectInputStream cin=new ObjectInputStream(inputFile);
Student s=(Student) cin.readObject();
System.out.println(s);
cin.close();
}
}
对象输出流——ObjectOutputStream
虽然类已经实现了Serializable接口,但如果要想真正地实现具体的序列化操作,则用户可以使用ObjectOutputStream类。
这个类继承结构如下:
java.lang.Object
-java.io.OutputStream
----java.io.ObjectOutputStream
由上看出,ObjectOutputStream是OutputStream的子类
OutputStream outputFile=new FileOutputStream(new File(“SerializedStudent”));
ObjectOutputStream cout=new ObjectOutputStream(outputFile);
cout.writeObject(new Student(“张三”,25));
cout.close();
ObjectOutputStream接收一个OutputStream对象用于保存待序列化的对象,然后cout调用writeObject方法保存对象。
对象输入流——ObjectInputStream
如果希望将已被序列化的对象再反序列化回来,则可以通过ObjectInputStream类完成,它用于读取将序列化对象。
这个类继承结构如下:
java.lang.Object
-java.io.InputStream
----java.io.ObjectInputStream
InputStream inputFile=new FileInputStream(new File(“SerializedStudent”));
ObjectInputStream cin=new ObjectInputStream(inputFile);
Student s=(Student)cin.readObject();
System.out.println(s);
cin.close();
ObjectInputStream接受一个InputStream对象用于保存待序列化的对象。然后cin调用readObject方法读取序列化后的对象。
在日后的实际开发中,这些序列化和反序列化的功能会由相关的容器完成。