【Java基础】序列化与反序列化(一)

目录

背景

概念

什么是序列化与反序列化?

如何实现序列化?

为什么要进行序列化与反序列化?

serialVersionUID是什么?

参考


背景

代码堆多了,基础反而都还给老师了。只是凭习惯,默认会给DO实体加上 implements Serializable ,又看到有的实体有人会加上。

    private static final long serialVersionUID = ******;

每周一记,这周来了解下序列化与反序列化基础,底层实现下期再会~(谁让我是一个小垃圾,气!)

概念

什么是序列化与反序列化?

序列化是指,将已经实例化的对象,转化为二进制的流,保存对象的状态和数据。

反序列化是指,将流形式重新转化为对象,进行操作。

扫描二维码关注公众号,回复: 11506207 查看本文章

如何实现序列化?

实现Serializable接口 无需重写任何方法 ObjectOutputStream采用默认的序列化方式,对非transient的实例变量进行序列化 ObjcetInputStream采用默认的反序列化方式,对非transient的实例变量进行反序列化
自定义方法readObject(ObjectInputStream in)、writeObject(ObjectOutputSteam out) ObjectOutputStream调用对象自定义的writeObject(ObjectOutputStream out)的方法进行序列化 ObjectOutputStream调用对象自定义的readObject(ObjectInputStream in)的方法进行反序列化
实现Externalizable接口 必须实现readExternal(ObjectInput in)和writeExternal(ObjectOutput out)方法 ObjectOutputStream调用对象自定义的writeExternal(ObjectOutput out))的方法进行序列化 ObjectInputStream会调用对象自定义的readExternal(ObjectInput in)的方法进行反序列化

为什么要进行序列化与反序列化?

因为要将对象持久化,比如写入文件、缓存、DB,还有,就是通过网络传输(RPC调用)。序列化为流形式进行传输,接收方再反序列化为对象进行使用。 

serialVersionUID是什么?

    private static final long serialVersionUID = ******;

serialVersionUID是序列化ID,具有唯一性。因为我从来没有显式定义过这个变量,所以专门查了查。不显式声明的话,系统就会自动生成一个。生成的输入有:类名、类及其属性修饰符、接口及接口顺序、属性、静态初始化、构造器。任何一项的改变都会导致serialVersionUID变化。如果序列化和反序列化的serialVersionUID不同,就会反序列化失败。 

【存疑】关于serialVersionUID有个疑问点, 我从来没有显式定义过,那RPC调用的时候,我这边对类的属性做了变化。调用方是如何调用成功的呢?这个后续查查原因。

参考

java 中为什么实体类需要实现序列化 

java序列化和序列化ID的作用 

java序列化和反序列化以及序列化ID的作用分析 

序列化和反序列化的底层实现原理是什么? 

java中什么是序列化和反序列化?

java序列化与反序列化原理 

Java对象序列化底层原理源码解析 

猜你喜欢

转载自blog.csdn.net/yxz8102/article/details/106179864