java实体类为什么要实现序列化操作(Java实体类为什么需要序列化和反序列化)
最近在学习做微服务的项目 ,在参考他人的微服务项目时 ,发现数据库表所对应的实体类都会实现Serializable接口,以往做的项目中并没有遇到过 ,也没有实现过这个接口 ,所以好奇实体类为什么需要实现该接口 ,在查阅相关博客后 ,进行了总结记录
原文链接:【java】java实体类为什么要实现Serializable接口_来日浅谈的博客-CSDN博客
1. 首先需要知道序列化的概念及使用场景
概念:序列化其实就是将Java对象转换为字节流的过程 ,反序列化则相反 ,是将字节流转换为Java对象
使用场景: 需要把内存中的对象状态数据保存到一个文件或者数据库中的时候 ,这个场景是比较常见的 ,例如我们利用mybatis框架编写持久层insert对象数据到数据库中时 网络通信时需要用套接字在网络中传送对象时 ,如我们使用RPC协议进行网络通信时当我们需要把对象的状态信息通过网络进行传输(网络传输),或者需要将对象的状态信息持久化时 ,就需要把对象进行序列化
序列化对于一门面向对象的编程语言来说还是十分重要的 ,因为无论什么编程语言,其底层涉及IO操作的部分是由操作系统帮其完成的 ,而IO操作都是以字节流的方式进行的 ,所以写操作都需要将编程语言的数据类型转换为字节流,读操作需要将字节流转换为编程语言的特定数据类型
2. 什么是Serializable接口
Serializable接口是用于实现Java类序列化操作而提供的一个语义级接口 ,一个类只有实现了Serializable接口 ,它的对象才能被序列化
但该接口中其实没有任何方法和字段 ,只是起到标记作用 ,相当于告诉JVM ,我需要在进行IO操作时将该对象转换为字节流
3. 为什么要定义serialVersionUID变量
由图中还可以看到定义了一个serialVersionUID变量
对于JVM来说 ,要进行持久化的类必须要有一个标记 ,只有持有这个标记JVM才允许类创建的对象可以通过其IO系统转换为字节数据 ,从而实现持久化 ,而这个标记就是Serializable接口 。
而在反序列化的过程中则需要使用serialVersionUID来确定由哪个类来加载这个对象,所以我们在实现Serializable接口的时候 ,一般还会要去尽量显示地定义serialVersionUID
如果没有显示地声明该变量 ,JVM会帮我们自动生成,但有时候可能会出现问题
该变量需要用private修饰 ,且为常量
创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!