序列化与反序列化
序列化是指将对象的状态信息转换为可以存储或传输形式的过程,在序列化期间,对象将其当前状态写到临时或持久性存储区,以后可以通过从存储区读取或者反序列化对象的状态,重新创建该对象!
序列化,利用ObjectOutputStream,对象的信息,按照固定格式转换成一串字节值输出并持久保存到磁盘
反序列化:利用ObjectInputStream,读取磁盘中之前序列化好的数据,重新恢复成对象
特点
- 需要序列化的文件必须实现Serializable接口,用来启用序列化功能
- 不需要序列化的数据可以修饰成static,原因:static资源属于类资源,不随着对象被序列化输出
- 每一个被序列化的文件都有一个唯一的id,如果没有添加此id,编译器会自动根据类的定义信息计算产生一个
- 在反序列化时候,如果和序列化的版本号不一致,无法完成反序列化
- 常用与服务器之间的数据传输,序列化成文件,反序列化读取数据
- 常用使用套接字流在主机之间传递对象
- 不需要序列化的数据也可以修饰成transient,只在程序运行期间在内存中存在,不会被序列化持久保存
序列化:ObjectOutputStream
构造方法:
ObjectOutputStream(OutputStream out)
创建写入指定 OutputStream 的 ObjectOutputStream
普通方法:
writeObject(Object obj)
将指定的对象写入 ObjectOutputStream
反序列化:ObjectInputStream
构造方法:
ObjectInputStream(InputStream in) 创建从指定 InputStream 读取的 ObjectInputStream
普通方法:
readObject() 从 ObjectInputStream 读取对象
package cn.tedu.test1;
import java.io.Serializable;
public class Student implements Serializable {
private static final long serialVersionUID = 2964503584901399973L;
private String name;//姓名
private int age;//年龄
private String addr;//地址
private char gender;//性别
public Student() {
System.out.println("我是Student的无参构造");
}
public Student(String name, int age, String addr, char gender) {
this.name = name;
this.age = age;
this.addr = addr;
this.gender = gender;
System.out.println("我是Student的有参构造");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
public char getGender() {
return gender;
}
public void setGender(char gender) {
this.gender = gender;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", addr='" + addr + '\'' +
", gender=" + gender +
'}';
}
}
package cn.tedu.test1;
import java.io.*;
public class XuLie {
public static void main(String[] args) {
ObjectOutputStream objectOutputStream=null;
ObjectInputStream objectInputStream=null;
try {
objectOutputStream= new ObjectOutputStream(new FileOutputStream("D://ready//1.txt"));
Student student = new Student("韩云", 20, "地狱", '男');
objectOutputStream.writeObject(student);
objectInputStream=new ObjectInputStream(new FileInputStream("D://ready/1.txt"));
Object o = objectInputStream.readObject();
System.out.println(o);
} catch (Exception e) {
e.printStackTrace();
}
finally{
try {
objectInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
objectOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}