对象输入与输出与序列化
对象输入/输出与序列化¶
Java语言支持一种称为对象序列化(object serialization)的通用机制,它可以将任何对象写出到输出流中,并在之后将其读回
- 序列化与反序列化
- 把对象转换为字节序列的过程称为对象的序列化
- 把字节序列恢复为对象的过程称为对象的反序列化
对象序列化用途¶
- 把对象的字节序列永久地保存到硬盘上,通常存放在文件中
- 在网络上传送对象的字节序列
- 无论是何种类型的数据,都会以二进制序列的形式在网络上传送。
- 发送方需要把这个Java对象转换为字节序列,才能在网络上传送
- 接收方需要将字节序列再恢复为Java对象
JDK类库中的序列化API¶
Java.io.ObjectOutputStream代表对象输出流,它的writeObject(Object obj)方法可对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中ObjectOutputStream(OutputStream out),创建一个ObjectOutputStream使得你可以将对象写出到指定的OutputStreamVoid writeObject(Object obj),写出指定的对象到ObjectOutputStream,这个方法将存储指定对象的类、类的签名以及这个类及其超类中所有非静态和非瞬时的域的值
序列化步骤¶
- 创建一个对象输出流,可以包装一个其他类型的目标输出流,比如文件输出流
- 通过对象输出流的
writeObject()方法写对象
JDK类库中的反序列化API¶
Java.io.ObjectInputStream代表对象输入流,它的readObject()方法可从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回。ObjectInputStream(InputStream in),创建一个ObjectInputStream用于从指定的InputStream中读回对象信息。
反序列化步骤¶
- 创建一个对象输入流,它可以包装一个其他类型的源输入流,比如文件输入流
FileInputStream - 通过对象输入流的
readObject方法读取对象
例:利用ObjectOutputStream对象writeObject输出可序列化对象
public class SeriDemo {
public static void main(String[] args) {
try{
Person p1 = new Person("zhangsan",30)
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.dat"));
oos.writeObject(p1);
}catch(Exception e){
e.printStackTrace();
}
}
}
调用readObject()方法得到序列化的对象
try{
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.dat"));
System.out.println("readObject():)");
Person person = (Person)ois.readObject(); //反序列化
}catch(Exception e){
e.printStackTrace();
}
被static修饰的字段不可以被序列化(因为被static修饰的字段属于类而不是对象,只有实例字段才会被序列化)