Java中序列化和反序列化以及serialVersionUID的作用
序列化:就是将对象转化成字节序列的过程。
反序列化:就是将字节序列转化成对象的过程。
为什么要序列化?
1.持久化。对象存储在jvm堆区,随着jvm的停止而消失,将对象序列化成字节序列,写进硬盘实现持久化。
2.网络传输。网络不能直接传输对象,所以传输前序列化,收到数据时反序列成对象。
JDK怎么实现序列化?
Java为我们提供了对象序列化的机制,规定了要实现序列化对象的类要满足的条件和实现方法。
1.条件:对于要序列化对象的类要去实现Serializable接口或者Externalizable接口
2.具体实现方法:JDK提供的ObjectOutputStream和ObjectInputStream来实现序列化和反序列化
如果实体类没有实现Serialize接口就去序列化,就会报错
演示demo
序列化
反序列化
serialVersionUID的作用
在进行序列化时,会把当前类的serialVersionUID写入到字节序列中(也会写入序列化的文件中),在反序列化时会将字节流中的serialVersionUID同本地对象中的serialVersionUID进行对比,一致的话进行反序列化,不一致则失败报错(报InvalidCastException异常)
serialVersionUID值的设置(private static final long serialVersionUID= XXXL )有三种情况:
显式声明:默认的1L:
显式声明:根据包名、类名、继承关系、非私有的方法和属性以及参数、返回值等诸多因素计算出的64位的hash值
隐式声明:未显式的声明serialVersionUID时java序列化机制会根据Class自动生成一个serialVersionUID(最好不要这样,因为如果Class发生变化,自动生成的serialVersionUID可能会随之发生变化,导致匹配不上)
json序列化和JDK序列化区别
JDK序列化/反序列化:原生方法不依赖其他类库、但是不能跨平台使用、字节数较大
json序列化/反序列化:json字符串可读性高、可跨平台使用无语言限制、扩展性好、但是需要第三方类库、字节数较大。