Java的序列化与反序列化
概念:
序列化:将java对象转化成为字节序列的过程;
反序列化:将字节序列转化成为Java对象的过程;
应用:
Java序列化与反序列化主要用于通信过程的数据交换,由于Java对象是存储在内存中的,无法像普通文本文件,图像等可以直接通过网络传输,但是有时两台或多台计算机之间就是需要传输一些对象信息该怎么办呢?
此时Java的序列化和反序列化就能够发挥其作用了:首先需要传送数据的一方利用序列化将需要传输的对象序列化成为二进制文件以后通过网络进行传输,而接收方在接收到此二进制文件以后,可以通过反序列化方法将此二进制文件恢复成为Java的对象,从而实现了Java对象的传输。
注意:
1、需要序列化的类必须实现Serializable接口;
2、该类所有属性必须可以序列化。
例:
import java.io.Serializable;
public class Person implements Serializable{
String name;
String gender;
int age;
public Person(String name, String gender, int age) {
super();
this.name = name;
this.gender = gender;
this.age = age;
}
}
序列化:
/**
* 序列化
*/
@Test
public void test() {
try {
FileOutputStream fos = new FileOutputStream("D:\\IO\\Person.ser");
ObjectOutputStream oos = new ObjectOutputStream(fos);
Person p1 = new Person("A", "Male", 21);
oos.writeObject(p1);
oos.flush();
oos.close();
fos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
反序列化:
@Test
public void test2(){
try {
FileInputStream fis = new FileInputStream("D:\\IO\\Person.ser");
ObjectInputStream ois = new ObjectInputStream(fis);
Person p2 = (Person) ois.readObject();
ois.close();
fis.close();
System.out.println("++++++++++++++++++++++");
System.out.println(p2.name);
System.out.println(p2.gender);
System.out.println(p2.age);
} catch (IOException | ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
结果:
补充:
1、需要序列化的类必须实现Serializable接口
2、该类需要序列化的属性必须可以序列化(实现Serializable接口)
3、静态变量不会被序列化
4、transient修饰的变量不会被序列化保存