1、什么是序列化?
- Java序列化是指把Java对象保存为二进制字节码的过程,Java反序列化是指把二进制码重新转换成Java对象的过程。
- 使用Java对象序列化,在保存对象时,会把其状态保存为一组字节,在未来,再将这些字节组装成对象。必须注意地是,对象序列化保存的是对象的"状态",即它的成员变量。由此可知,对象序列化不会关注类中的静态变量。
- 整个过程都是 Java 虚拟机(JVM)独立的,也就是说,在一个平台上序列化的对象可以在另一个完全不同的平台上反序列化该对象。
- static和transient字段不能被序列化。
2、使用序列化的原因
第一种情况是:一般情况下Java对象的声明周期都比Java虚拟机的要短,实际应用中我们希望在JVM停止运行之后能够持久化指定的对象,这时候就需要把对象进行序列化之后保存。
第二种情况是:需要把Java对象通过网络进行传输的时候。因为数据只能够以二进制的形式在网络中进行传输,因此当把对象通过网络发送出去之前需要先序列化成二进制数据,在接收端读到二进制数据之后反序列化成Java对象。
3、序列化的实现
要实现序列化对象所在的Employee类:
//要实现Serializable接口;
public class Employee implements Serializable{
private String name ;
private int id;
private int age ;
private String sex;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
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 void getAll(){
System.out.println(name+","+age+","+sex+","+id);
}
}
序列化过程:
public class SetSerialize {
public static void main(String[] args) {
Employee emp = new Employee();
emp.setAge(18);
emp.setId(01);
emp.setName("lisa");
emp.setSex("女");
try {
//当序列化一个对象到文件时, 按照 Java 的标准约定是给文件一个 .ser 扩展名。
FileOutputStream fileOut =
new FileOutputStream("/employee.ser");//保存所在的文件,要以ser为后缀
ObjectOutputStream out = new ObjectOutputStream(fileOut);
out.writeObject(emp);
out.close();
fileOut.close();
System.out.printf("Serialized data is saved in /employee.ser");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
4、反序列化的实现
使用的还是上面的Employee类。
反序列化过程:
public class GetSerialize {
public static void main(String[] args) {
Employee emp = null;
FileInputStream fileIn;
try {
fileIn = new FileInputStream("/Employee.ser");
ObjectInputStream in = new ObjectInputStream(fileIn);
emp = (Employee) in.readObject();
in.close();
fileIn.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Deserialized Employee...");
System.out.println(emp.getName()+","+emp.getAge()+","+
emp.getSex()+","+emp.getId());
}
}