首先呢?要了解啥是序列化和啥是反序列化,他们的作用分别是什么呢?
简单来说:
序列化就是把一个对象保存到一个文件或数据库字段去,而反序列化就是在适当的时候把这个文件再转化成原来的对象使用。
学生类
package 文件;
import java.io.Serializable;
public class Student implements Serializable {
public int getNo() {
return no;
}
public void setNo(int no) {
this.no = no;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
private int no;
private String name;
public Student(int no, String name) {
this.no = no;
this.name = name;
}
public String toString(){
return "学生名字:"+this.getName()+" 学号:"+this.getNo();
}
}
序列化
package 文件;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
public class ObjectOutStreamTest01 {
public static void main(String[] args)throws Exception{
//创建java对象
Student s=new Student(1111,"zhangsan");
ObjectOutputStream cos=new ObjectOutputStream(new FileOutputStream("students"));
//序列化对象
/* try {
ObjectOutputStream cos=new ObjectOutputStream(new FileOutputStream("stusents"));
} catch (IOException e) {
e.printStackTrace();
}*/
cos.writeObject(s);
//刷新
cos.flush();
//关闭
cos.close();
}
}
反序列化
package 文件;
import java.io.*;
import java.util.List;
public class ObjectInputStreamTest01 {
public static void main(String[] args)throws Exception{
ObjectInputStream ios= new ObjectInputStream(new FileInputStream("students"));
//反序列化对象
Object obj=ios.readObject();
System.out.println(obj);
ios.close();
}
}
/*
学生名字:zhangsan 学号:1111
进程已结束,退出代码0
...*/
敲黑板
transient关键字的作用是:被transient关键字修饰的变量不参与序列化和反序列化,当一个对象被序列化的时候,transient型的变量的值不包括在序列化的表示中。
/*
注意:通过源代码发现, Serializable接口只是一个标志接口:
public interface Serializable {
}
这个接口当中什么代码都没有。
那么它起到一个什么作用呢?
起到标识的作用,标志的作用, java虚拟机看到这个类实现了这个接口,可能会对这个类进行特殊待遇。
Serializable这个标志接口是给java虚拟机参考的, java虚拟机看到这个接口之后,会为该类自动生成一个序列化版本号。
一次序列化多个对象呢?
可以,可以将对象放到集合当中,序列化集合。
提示:
参与序列化的Arraylist集合以及集合中的元素User都需要实现java. io. Serializable接口。
package 文件;
import java.io.Serializable;
import java.util.Arrays;
public class User implements Serializable {
private int no;
private transient String name;//name不参与序列化操作
//transient关键字表示游离的,不参与序列化
public int getNo() {
return no;
}
public void setNo(int no) {
this.no = no;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public User(int no, String name){
this.no = no;
this.name = name;
}
@Override
public String toString() {
return "User{" +
"no=" + no +
", name='" + name + '\'' +
'}';
}
}
package 文件;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;
public class ObjectOutputStreamTest02 {
public static void main(String[] args)throws Exception{
List<User> userlist=new ArrayList<>();
userlist.add(new User(1,"zhangsan"));
userlist.add(new User(2,"lisi"));
userlist.add(new User(3,"wangwu"));
ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("users"));
oos.writeObject(userlist);
oos.flush();;
oos.close();
}
}
package 文件;
import java.io.*;
import java.util.List;
public class ObjectInputStreamTest01 {
public static void main(String[] args)throws Exception{
//反序列化对象
ObjectInputStream ios= new ObjectInputStream(new FileInputStream("users"));
List<User> userlist=(List<User>)ios.readObject();
for(User user:userlist){
System.out.println(user);
}
ios.close();
}
}
/*
User{no=1, name='null'}
User{no=2, name='null'}
User{no=3, name='null'}
进程已结束,退出代码0
*/