一.序列化与反序列化是什么
在java当中,我们创建出来的对象都是存在于JVM当中的,一旦JVM停止运行,同时也就意味着对象的消失。如果我们想要获取对象的完整信息并对其进行传输,就需要对java对象进行序列化过程
。同样的,如果我们想通过读取字节流文件来获取对象信息,就需要反序列化过程。
序列化
:将java对象转换为有序字节流(二进制数据)
的过程,以便于进行网络传输或者以文件形式进行保存。
反序列化
:通过读取对象有序字节流来获取对象信息,重建java对象。
二.序列化与反序列化的特点
1.可以实现分布式对象
java序列化与反序列化被广泛应用于RMI
(远程调用,可简单理解为由一个JVM去调用另一个JVM中的对象)和网络传输
中。
2.java对象的序列化是深层次的
在对一个java对象进行序列化时,不仅会将对象本身序列化,同时也会将对象所调用的对象和它的子类对象同时序列化。
三.序列化与反序列化的实现
在java中,我们可以通过实现Serializabel接口
来完成对象的序列化。测试代码:
实现了Serializable接口的类
package package02_serializabel;
import java.io.Serializable;
public class Demo01 implements Serializable {
private String name;
private 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;
}
@Override
public String toString() {
return "Demo01{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
主函数
package package02_serializabel;
import java.io.*;
public class SerializableDemo01 {
public static void main(String[] args) throws IOException, ClassNotFoundException {
//初始化对象信息
Demo01 demo01 = new Demo01();
demo01.setAge(18);
demo01.setName("李白");
//序列化对象,保存到文件中
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("file01"));
oos.writeObject(demo01);
oos.close();
//反序列化
File file = new File("file01");
ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(file));
Demo01 newDemo01 = (Demo01) objectInputStream.readObject();
System.out.println(newDemo01.toString());
}
}
注意:static修饰的属性无法被序列化.
链接: Java 序列化的高级认识.