一、序列化的含义,使用意义,使用场景
序列化:将对象写入到IO流中反序列化:从IO流中恢复对象意义:序列化机制允许将实现序列化的Java对象转换位字节序列,这些字节序列可以保存在磁盘上,或通过网络传输,以达到以后恢复成原来的对象。序列化机制使得对象可以脱离程序的运行而独立存在。使用场景:所有可在网络上传输的对象都必须是可序列化的,传入的参数或返回的对象都是可序列化的,否则会出错;所有需要保存到磁盘的java对象都必须是可序列化的。通常建议:程序创建的每个JavaBean类都实现Serializeable接口。
二、实现序列化机制
这里讲的时平时用的比较多的方法,实现Serializable,每个实现了Serializable接口的实体类都可以被序列化和反序列化
创建实体类
package cn
.kexing
.bean
;
import java
.io
.Serializable
;
public class User implements Serializable {
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
;
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