公众号上线啦!
搜一搜【国服冰】
使命:尽自己所能给自学后端开发的小伙伴提供一个少有弯路的平台
回复:国服冰,即可领取我为大家准备的资料,里面包含整体的Java学习路线,电子书,以及史上最全的面试题!
一、序列化的含义,使用意义,使用场景
- 序列化:将对象写入到IO流中
- 反序列化:从IO流中恢复对象
- 意义:序列化机制允许将实现序列化的Java对象转换位字节序列,这些字节序列可以保存在磁盘上,或通过网络传输,以达到以后恢复成原来的对象。序列化机制使得对象可以脱离程序的运行而独立存在。
- 使用场景:所有可在网络上传输的对象都必须是可序列化的,传入的参数或返回的对象都是可序列化的,否则会出错;所有需要保存到磁盘的java对象都必须是可序列化的。通常建议:程序创建的每个JavaBean类都实现Serializeable接口。
二、实现序列化机制
这里讲的时平时用的比较多的方法,实现Serializable,每个实现了Serializable接口的实体类都可以被序列化和反序列化
创建实体类
package cn.kexing.bean;
import java.io.Serializable;
public class User implements Serializable {
//设置User类序列化版本号
private static final long serialVersionUID = 1642373918479262059L;
private int id;
private String name;
private transient String position;
public User(){}
public User(int id, String name, String position) {
this.id = id;
this.name = name;
this.position = position;
}
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 String getPosition() {
return position;
}
public void setPosition(String position) {
this.position = position;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", position='" + position + '\'' +
'}';
}
}
创建序列化版本号的好处
在 序列化存储/反序列化读取 或者是 序列化传输/反序列化接收 时,JVM 会把传来的字节流中的serialVersionUID与本地相应实体(类)的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常。
如何让IDEA自动生成serialVersionUID
进入setting - >
设置完后鼠标移到需要添加序列化版本号的类上 alt+回车可由idea自动根据实体类、接口名等生成一个不会重复的哈希字段
防止字段被序列化
transient关键字可以防止字段被序列化,在实体类属性前加上transient 关键字,当实体类被序列化和反序列化时,该属性会始终为该数据类型的初始值
ObjectOutputStream序列化对象
package cn.kexing.Serialization;
import cn.kexing.bean.User;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;
/**
* 序列化Student 与 User 对象
*/
public class ObjectOutputStream01 {
public static void main(String[] args) {
try {
List<User> list = new ArrayList<>();
list.add(new User(001,"zhangsan","teacher1"));
list.add(new User(002,"lisi","teacher2"));
list.add(new User(003,"wangwu","teacher3"));
list.add(new User(004,"zhaoliu","teacher4"));
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("D:\\IDEA_workspace\\serialization\\src\\a.txt"));
oos.writeObject(list);
oos.flush();
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
D:\IDEA_workspace\serialization\src下生成文件:a.txt
序列化后文件
sr java.util.ArrayListx佉櫱a� I sizexp w sr cn.kexing.bean.User梪I襯3!� I idL namet Ljava/lang/String;xp t zhangsansq ~ t lisisq ~ t wangwusq ~ t zhaoliux
ObjectInputStream反序列化
package cn.kexing.Serialization;
import cn.kexing.bean.User;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.util.List;
public class ObjectInputStream01 {
public static void main(String[] args) {
try {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("D:\\IDEA_workspace\\serialization\\src\\a.txt"));
List<User> list = (List<User>) ois.readObject();
System.out.println(list instanceof List);
for(User user: list){
System.out.println(user);
}
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
true
User{id=1, name='zhangsan', position='null'}
User{id=2, name='lisi', position='null'}
User{id=3, name='wangwu', position='null'}
User{id=4, name='zhaoliu', position='null'}
position字段由于被设置为禁止序列化,所以这里的值为null