概念
Java的序列化是将对象转换为字节流的过程,使得对象可以通过网络传输或者在分布式系统中进行对象的传递等。那么反序列化就是将字节流转为对象的过程了,在反序列化过程中,Java会使用字节流中的信息重构对象,并将其重新加载到内存中。
应用场景
网络传输,持久化存储,缓存,远程调用等
序列化的实现
java的类中只有继承Sericalizable接口才可以被序列化,同时最好指定一个SericalizableUID,
一般情况下我们都写为
private static final long serialVersionUID = 1L;
这个可以理解为版本号,jvm会把传进来的字节流中的serialVersionUID与本地实体类的serialVersionUID进行对比,如果相同就认为是一致的,就可以进行反序列化,否则就会报序列化版本不一样的异常。如果我们在实现Sericalizable接口的时候没有给定UID,jvm每次编译的时候就会默认生成一个UID,这样的话当反序列化之前程序修改了一些代码,比如增加了一些字段,再次编译时就会再生成另外不同的UID,当反序列话进行比对的时候自然就对不上了,便会报异常。
反序列化的问题
攻击者能够将恶意数据序列化存储到数据库或内存中或者执行我们不期望的代码,因此在反序列化的过程中我们还需要进行安全检测,如JWT就是其中的一个措施。