①什么时候需要使用序列化与反序列化
——一个对象存活时间不会比JVM还要长,但是当我们需要让一个对象在JVM停止运行之后还能持久保存,并且将来可以重新读取使用
——两个进程之间需要相互传送对象时也要使用序列化,一方面,发送方需要把这个Java对象转换为字节序列,然后在网络上传送;另一方面,接收方需要从字节序列中恢复出Java对象。
②序列化与反序列化
Java序列化是指把Java对象转换为字节序列的过程;而Java反序列化是指把字节序列恢复为Java对象的过程。
③JDK类库中序列化的API
java.io.ObjectOutputStream:表示对象输出流
它的writeObject(Object obj)方法可以对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。
java.io.ObjectInputStream:表示对象输入流
它的readObject()方法源输入流中读取字节序列,再把它们反序列化成为一个对象,并将其返回。
④怎么实现序列化
实现了Serializable或Externalizable接口的类的对象才能被序列化,否则抛出异常
⑤当一个类实现序列化后不想他全部成员都被序列化,我们要用transient关键字修饰
下面是一个例子,Student类实现了Serializable接口
import java.io.Serializable;
import java.util.Calendar;
public class Student implements Serializable {
String name;
int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Calendar getBir() {
return bir;
}
public void setBir(Calendar bir) {
this.bir = bir;
}
String sex;
Calendar bir;
}
测试类Main,将Student
对象保存到文件中,实现序列化,再将
对象读取出来,实现反序列化
import java.io.*;
import java.util.Calendar;
import java.util.HashMap;
public class Main {
public static void main(String[] args) {
Calendar cal=Calendar.getInstance();
cal.clear();
cal.set(Calendar.YEAR,2014);
cal.set(Calendar.MONTH,03);
Student stu1=new Student();
stu1.setAge(3);
stu1.setBir(cal);
stu1.setSex("男");
stu1.setName("小明");
File file=new File("/Users/apple/Documents/序列化/java.pages");
try{//Student序列化过程
FileOutputStream fos = new FileOutputStream(file);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(stu1);
oos.flush();
oos.close();
fos.close();
//Student对象反序列化过程
FileInputStream fis = new FileInputStream(file);
ObjectInputStream ois = new ObjectInputStream(fis);
Student st1 = (Student) ois.readObject();
System.out.println("name = " + st1.getName());
System.out.println("sex = " + st1.getSex());
System.out.println("age = "+ stu1.getAge());
System.out.println("birthday ="+ stu1.getBir());
ois.close();
fis.close();
}catch (IOException ioe){
System.out.println("ioe");
}catch(ClassNotFoundException filee)
{
System.out.println("file");
}
}
}
控制台输出结果
如果Student类中的Name属性被关键字transient修饰,那么Name就不能被序列化
运行结果如下图:name为空,不能被序列化和反序列化
希望对大家有帮助!!!