一:什么是序列化与反序列化
序列化:
- 将内存中的对象变为二进制字节流的形式进行传输或保存在文本中;
- 并不是所有对象都要被序列化, 一般对象要进行传输需要被序列化;
- 对象若要被序列化输出,该类需要实现Serializable接口。即只有实现Serializable接口的类才有序列化能力。
反序列化:把文本中二进制字节流反序列化为一个对象。
import java.io.Serializable;
public interface Serializable {
}
Serializable 接口里什么功能也没有,只是一个标识接口,标识着实现Serializable 的类具有序列化功能。
实现序列化与 反序列化
实现序列化与反序列化,需要使用IO包提供的两个类:
- ObjectOutputStream----对象字节输出流,不存在对象字符输出流
- ObjectInputStream—对象字节输入流,不存在对象字符输入流
对象的序列化输出----ObjectOutputStream
public class ObjectOutputStream extends OutputStream implements ObjectOutput, ObjectStreamConstants
构造方法:
//out指通过什么方式进行传输,可以是文件等
public ObjectOutputStream(OutputStream out) throws IOException
对象写入方法:
//需要传入要写入的对象
public final void writeObject(Object obj) throws IOException
例:对象序列化
package CODE.JavaIo;
import java.io.File;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
//实现Serializable接口 ,具有序列化功能
class Student implements Serializable
{
private String name; //姓名
private int sno; //学号
public Student(String name, int sno) {
this.name = name;
this.sno = sno;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", sno='" + sno + '\'' +
'}';
}
}
public class Xulie {
public static void main(String[] args) throws Exception {
//1.取得终端对象
File file=new File("C:"+File.separator+"Users"+File.separator+
"lenovo"+File.separator+"Desktop"+
File.separator+"Test.txt");
//2.取得对象的输出流,对象序列化
Student s=new Student("pick",24);
ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream(file));
//3.对象的写入
oos.writeObject(s);
//4.关闭流
oos.close();
}
}
对象的反序列化输入----ObjectInputStream
public class ObjectInputStream extends InputStream implements ObjectInput, ObjectStreamConstants
构造方法:
//传输输入流对象
public ObjectInputStream(InputStream in) throws IOException
对象的反序列化输入:
//由于是从文本中读取,需要将文本中二进制字节流反序列化为一个对象返回
public final Object readObject() throws IOException, ClassNotFoundException
例:对象的反序列化
package CODE.JavaIo;
import java.io.*;
public class Xulie {
public static void main(String[] args) throws Exception {
//1.取得终端对象
File file=new File("C:"+File.separator+"Users"+File.separator+
"lenovo"+File.separator+"Desktop"+
File.separator+"Test.txt");
//2.对象的输入流,对象反序列化
ObjectInputStream ois=new ObjectInputStream(new FileInputStream(file));
//3.对象反序列化输入
Object obj=ois.readObject(); //Student向上转型
System.out.println(obj); //Student{name='pick', sno='24'}
//4.关闭流
ois.close();
}
}
transient关键字
Serializable默认将对象中所有属性以及值进行序列化以及反序列化,如果某些属性(密码)不需要被序列化输出,可以在属性前加transient关键字。
class Student implements Serializable
{
private String name; //姓名
private transient int sno; //学号将不会被序列化保存
}
反序列化对象:
System.out.println(obj); //Student{name='pick', sno='0'}
此时反序列化后的对象的sno就为默认值0。