java序列化和反序列化
1.引入序列化
在程序中为了能直接以java对象的形式保存数据,然后重新获得该java对象,这就需要使用序列化
2.序列化:
①.把内存中的java对象数据,通过某种方式把对象存储到本地磁盘或者传递给其他网络节点,这个执行的过程称为序列化
②.将对象转化成二进制的过程
3.反序列化:
①.把磁盘文件中的对象数据或者网络节点中的对象数据,恢复成java对象的过程。
②.把序列化后生成的二进制数据转换成对象的过程。
4.为什么使用序列化?
* 序列化是一种处理对象流的机制,将对象的内容进行流化,可以对流化后的数据进行读写操作
* 序列化就是为了解决对象流读写操作所引发的问题。
5.序列化的优点
* ①.对于远程调用能方便对对象进行编码和解码,就像实现对象直接传输。
* ②.可以将对象持久化到磁盘等介质中,就像实现对象直接存储。(一般是对于NOSQL)
6.如何实现序列化
* ①.实现序列化只需要实现一个接口 Serializable
* ②.Serializable接口中没有任何方法,只要实体类实现此接口,JVM就认为此类可被序列化,这就是一种默认的序列化机制
* ③.如果项目升级或者修改(增加属性或者减少属性),会引发反序列异常
* 解决方案:在JavaBean对象增加serialVersionUID字段,用来固定版本,无论怎么修改,版本都是一致的,才能进行反序列。
创建一个实体类(Student)实现Serializable接口
public class Student implements Serializable{
// 序列化版本ID
private static final long serialVersionUID = -5831565521782795983L;
// 学号
private int id;
// 姓名
private String name;
// 性别
// transient 标注此属性不需要序列化
private transient char sex;
private String address;
public Student() {
}
public Student(int id, String name, char sex) {
super();
this.id = id;
this.name = name;
this.sex = sex;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", address=" + address + "]";
}
}
序列化:把内存中的对象写入到磁盘
// 序列化:把内存中的对象写入到磁盘
@Test
public void test1() throws IOException {
// 创建一个集合
List<Student> list = new ArrayList<Student>();
list.add(new Student(1, "张三", '男'));
list.add(new Student(2, "李四", '女'));
list.add(new Student(3, "王五", '男'));
list.add(new Student(4, "赵六", '女'));
// 创建一个File对象
File file = new File("src/student.dat");
FileOutputStream fos = new FileOutputStream(file);
ObjectOutputStream oos = new ObjectOutputStream(fos);
// 将集合信息写入到文件中
oos.writeObject(list);
// 释放资源
oos.close();
}
反序列化:把磁盘中的数据加载到内存(重新加载对象)
// 反序列化:把磁盘中的数据加载到内存(重新加载对象)
@Test
public void test2() throws IOException, ClassNotFoundException{
// 创建反序列集合
List<Student> arraylList = new ArrayList<Student>();
// 读文件
ObjectInputStream ois = new ObjectInputStream(
new FileInputStream(new File("src/student.dat")));
// 创建集合保存反序列化的学生对象
List<Student> list = (List<Student>)ois.readObject();
// 释放资源
ois.close();
for (Student student : list) {
arraylList.add(student);
}
for (Student student : arraylList) {
System.out.println(student);
}
}