## 什么是序列化和反序列化
**序列化:**把堆内存中的java对象数据,通过某种方式把对象存储到磁盘文件或者传递给其他网络节点。这个过程称为序列化。简单来说呢,就是将对象转换成二进流的过程。
**反序列化:**把磁盘文件或网络节点上的对象数据恢复成java模型的过程,也就是将序列化过程中产生的二进制串转化为数据结构或者对象的过程。
为什么要序列化
1.在分布式系统或者需要远程调用,此时就需要把对象在网络上传输,需要把对象转为二进制形式,需要共享的JavaBean对象,都需要做序列化。
2.服务器钝化:如果服务器发现某些对象好久没活动了,那么服务器就会把这些内存中的对象持久化在本地磁盘文件中(Java对象转换为二进制文件);如果服务器发现某些对象需要活动时,先去内存中寻找,找不到再去磁盘文件中反序列化我们的对象数据,恢复成 Java 对象。这样能节省服务器内存。
### java怎么进行序列化
1.需要序列化的类都要实现Java.lang.Serializable接口(这是一个标志接口,没有任何抽象方法),没有实现序列化接口,在序列化过程中会抛出不支持序列化的异常。
2.在java中使用对象流来完成序列化和反序列化:
ObjectOutputStream:通过 writeObject()方法做序列化操。
ObjectInputStream:通过 readObject() 方法做反序列化操作。
#### 第一步:创建JavaBean对象
public class User implements Serializable{
private String name;
private Integer age;
transient private String sex;
***** 省略get、set方法******
public User(String name,Integer age){
this.name = name;
this.age = age;
}
}
#### 第二步:使用ObjectOutputStream对象实现序列化
OutputStream op = new FileOutputStream("io"+File.separator+"a.txt");
ObjectOutputStream ops = new ObjectOutputStream(op);
ops.writeObject(new User("test",1));
ops.close;
#### 第三步:使用ObjectInputStream 对象实现反序列化
InputStream in = new FileInputStream("io"+File.separator+"a.txt");
ObjectInputStream os = new ObjectInputStream(in);
User user = (User) os.readObject();
os.close();
问题:
如果某些数据不需要做序列化,比如上面的性别?
- 在字段面前加上 transient,反序列化得到的属性值为默认值
序列化版本问题,在完成序列化操作后,由于项目的升级或修改,可能我们会对序列化对象进行修改,比如增加某个字段,那么我们在进行反序列化就会报错
- 在 JavaBean 对象中增加一个 serialVersionUID 字段,用来固定这个版本,无论我们怎么修改,版本都是一致的,就能进行反序列化了
private static final long serialVersionUID = 8656128222714547171L;