java序列化

java序列化和反序列化

如果我们需要持久化Java对象比如将Java对象保存在文件中,或者在网络传输Java对象,这些场景都需要用到序列化。
序列化: 将数据结构或对象转换成二进制字节流的过程
反序列化:将在序列化过程中所生成的二进制字节流的过程转换成数据结构或者对象的过程

实际开发中有哪些用到序列化和反序列化的场景?

1 在进行网络开发时,进行数据的交换前,需要先将这个entry类实现可序列化接口
2 将对象存储到文件中的时候需要进行序列化,将对象从文件中读取出来需要进行反序列化。
3 将对象存储到缓存数据库(如 Redis)时需要用到序列化,将对象从缓存数据库中读取出来需要反序列化。

常见序列化协议对比

JDK自带的序列化方式一般不会用 ,因为序列化效率低并且部分版本有安全漏洞。比较常用的序列化协议有 hessian、kyro、protostuff。
下面提到的都是基于二进制的序列化协议,像 JSON 和 XML这种属于文本类序列化方式。虽然 JSON 和 XML可读性比较好,但是性能较差,一般不会选择。
#### jdk自带的序列化 实现java.io.Serializable 即可
```java
import java.io.Serializable;

@TableName("user")
@Data
public class user implements Serializable {

@TableId("id")
private Long id;
//会自动开启驼峰
@TableField("user_name")  //指定属性所对应的字段名
private  String userName;
private  Integer age;
private  String email;
@TableLogic   //逻辑删除 便于后续进行数据的恢复 
private  Integer isDelete;

}
```
我们很少或者说几乎不会直接使用这个序列化方式,主要原因有两个:

不支持跨语言调用 : 如果调用的是其他语言开发的服务的时候就不支持了。
性能差 :相比于其他序列化框架性能更低,主要原因是序列化之后的字节数组体积较大,导致传输成本加大。

实现Java的序列化注意事项:

-- Java的序列化时,transient变量和静态变量不会被序列化

-- 如果先序列化对象A后序列化B,那么在反序列化的时候一定记着JAVA规定先读到的对象是先被序列化的对象,不要先接收对象B,
        因为那样会报错,尤其在使用Externalizable的时候一定要注意读取的先后顺序

-- 实现序列化接口的对象并不强制声明唯一的serialVersionUID,
        但是是否声明serialVersionUID对于对象序列化的向上向下的兼容性有很大的影响

posted @ 2022-11-13 20:16  wiselee/  阅读(47)  评论(0编辑  收藏  举报