一、序列化与反序列化
1.
Java 提供了一种对象序列化的机制,该机制中,一个对象可以被表示为一个字节序列,该字节序列包括该对象的数据、有关对象的类型的信息和存储在对象中数据的类型。
将序列化对象写入文件之后,可以从文件中读取出来,并且对它进行反序列化,也就是说,对象的类型信息、对象的数据,还有对象中的数据类型可以用来在内存中新建对象。
在Java中,只要一个类实现了java.io.Serializable接口,那么它就可以被序列化
整个过程都是 Java 虚拟机(JVM)独立的,也就是说,在一个平台上序列化的对象可以在另一个完全不同的平台上反序列化该对象。
ObjectInputStream类 和 ObjectOutputStream类 是高层次的数据流,它们包含反序列化和序列化对象的方法
Java序列化是指把Java对象保存为二进制字节码的过程,Java反序列化是指把二进制码重新转换成Java对象的过程
序列化(输出)
是将对象的状态写入到特定的流中的过程,可称流化;(转换二进制的字节写入到流)
反序列化(输入)则是从特定的流中读取数据重新构建对象的过程,可理解为把流对象化;(把二进制流转换为对象)
简而言之就是用流的方式实现对象的输出输入
反序列化(输入)则是从特定的流中读取数据重新构建对象的过程,可理解为把流对象化;(把二进制流转换为对象)
简而言之就是用流的方式实现对象的输出输入
序列化步骤
1.将需要被序列化的对象实现Serializable接口,具有序列化能力
2.创建对象输出流----ObjectOutputiStream
3.调用writeObject()方法将对象写入文件
4.关闭对象输出流
1.将需要被序列化的对象实现Serializable接口,具有序列化能力
2.创建对象输出流----ObjectOutputiStream
3.调用writeObject()方法将对象写入文件
4.关闭对象输出流
反序列化步骤
1.创建对象输入流----ObjectInputStream
2.调用readObject()方法将文件对象读取进来
3.读取的对象是Object类型的,所以要经过强制转换,并用对应的类对象来接受
1.创建对象输入流----ObjectInputStream
2.调用readObject()方法将文件对象读取进来
3.读取的对象是Object类型的,所以要经过强制转换,并用对应的类对象来接受
4.关闭对象输入流
实例代码:创建一个类,放入属性和方法实现
Serializable接口
import java.io.Serializable; //导包
public class Student implements Serializable { //实现java.io.Serializable接口
private int uid;
private String name;
private String sex;
/*private transient String password;*/ //可在属性前加transient关键字,不被序列化
public int getUid() {
return uid;
}
public void setUid(int uid) {
this.uid = uid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Student(int uid, String name, String sex) {
super();
this.uid = uid;
this.name = name;
this.sex = sex;
}
}
private String name;
private String sex;
/*private transient String password;*/ //可在属性前加transient关键字,不被序列化
public int getUid() {
return uid;
}
public void setUid(int uid) {
this.uid = uid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Student(int uid, String name, String sex) {
super();
this.uid = uid;
this.name = name;
this.sex = sex;
}
}
2.创建另外一个类,创建对象,序列化,反序列化
public static void main(String[] args) {
OutputStream os=null; //字节写入
ObjectOutputStream oos=null;
InputStream is=null; //字节读取
ObjectInputStream ois=null;
Student stu=new Student(6, "陈京旗", "男"); //创建对象,添加数据
try {
//序列化 输出流
os=new FileOutputStream("F:/陈京旗.txt");//指定文件路径,准备输出流到该文件
oos =new ObjectOutputStream(os); //以FileOutputStream字节流作为参数包装成ObjectOutputStream输出流
oos.writeObject(stu); //.writeObject()方法写入对象数据,转化为二进制字节流
//反序列化 输入流
is=new FileInputStream("F:/陈京旗.txt"); //读取指定文件信息
ois=new ObjectInputStream(is); //以FileInputStream字节流作为参数包装成ObjectInputStream输入流
Student student=(Student)ois.readObject(); //创建新对象接收读取到流的信息,读取到的是Object类,强转为学生类
//提取信息
System.out.println("["+student.getUid()+","+student.getName()+","+student.getSex()+"]");
}
catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}finally{
try {
ois.close();
is.close();
oos.close();
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
OutputStream os=null; //字节写入
ObjectOutputStream oos=null;
InputStream is=null; //字节读取
ObjectInputStream ois=null;
Student stu=new Student(6, "陈京旗", "男"); //创建对象,添加数据
try {
//序列化 输出流
os=new FileOutputStream("F:/陈京旗.txt");//指定文件路径,准备输出流到该文件
oos =new ObjectOutputStream(os); //以FileOutputStream字节流作为参数包装成ObjectOutputStream输出流
oos.writeObject(stu); //.writeObject()方法写入对象数据,转化为二进制字节流
//反序列化 输入流
is=new FileInputStream("F:/陈京旗.txt"); //读取指定文件信息
ois=new ObjectInputStream(is); //以FileInputStream字节流作为参数包装成ObjectInputStream输入流
Student student=(Student)ois.readObject(); //创建新对象接收读取到流的信息,读取到的是Object类,强转为学生类
//提取信息
System.out.println("["+student.getUid()+","+student.getName()+","+student.getSex()+"]");
}
catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}finally{
try {
ois.close();
is.close();
oos.close();
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}