编程语言
首页 > 编程语言> > java序列化与反序列化

java序列化与反序列化

作者:互联网

什么是序列化

java序列化就是把内存中的对象转换为字节序列的过程(其实就是将对象转换为二进制),目的是为了保存,或者网络传输。

什么是反序列化

反序列化相反,就是把磁盘中的字节序列转换为对象模型。

如何实现序列化

要实现对象的序列化,最直接的操作就是实现Serializable接口

序列化ID的作用

private static final long serialVersionUID = 1L;
这个序列化ID起着关键的作用,它决定着是否能够成功反序列化!java的序列化机制是通过判断运行时类的serialVersionUID来验证版本一致性的,在进行反序列化时,JVM会把传进来的字节流中的serialVersionUID与本地实体类中的serialVersionUID进行比较,如果相同则认为是一致的,便可以进行反序列化,否则就会报序列化版本不一致的异常。

默认的序列化ID

当我们一个实体类中没有显式的定义一个名为“serialVersionUID”、类型为long的变量时,Java序列化机制会根据编译时的class自动生成一个serialVersionUID作为序列化版本比较,这种情况下,只有同一次编译生成的class才会生成相同的serialVersionUID。 譬如,当我们编写一个类时,随着时间的推移,我们因为需求改动,需要在本地类中添加其他的字段,这个时候再反序列化时便会出现serialVersionUID不一致,导致反序列化失败。那么如何解决呢?便是在本地类中添加一个“serialVersionUID”变量,值保持不变,便可以进行序列化和反序列化。

序列化的其他问题

1.静态变量不会被序列化( static,transient)
2.当一个父类实现序列化,子类自动实现序列化,不需要显式实现Serializable接口。
3.当一个对象的实例变量引用其他对象,序列化该对象时也把引用对象进行序列化。

使用效率更高的序列化框架—Protostuff

其实java的原生序列化方式(通过实现Serialiable接口),效率并不是最高的。
github上有一个分析序列化效率的项目:https://github.com/eishay/jvm-serializers/wiki
在这里插入图片描述
详细地址:
java序列化详解

标签:java,对象,实现,序列化,ID,serialVersionUID
来源: https://blog.csdn.net/qq_21399461/article/details/121468643