java序列化全解析

java序列化全解析



一、什么是java序列化?

序列化就是把 Java 对象转为⼆进制流,⽅便存储和传输。所以反序列化就是把⼆进制流恢复成对象。
在这里插入图片描述

二、实现序列化

1. 实现Serializable接⼝

将需要传输的实体实现Serializable 接⼝

@Data
@ToString
@SuperBuilder
@NoArgsConstructor
@Accessors(chain = true)
public class BaseResponse implements Serializable {
    /** serialVersionUID */
    private static final long serialVersionUID = 1L;
}

2. Serializable是什么接⼝?

这个接⼝只是⼀个标记,没有具体的作⽤,但是如果不实现这个接⼝,在有些序列化场景会报错,所以⼀般建议,
创建的 JavaBean 类都实现 Serializable。

3. serialVersionUID⼜有什么⽤?

serialVersionUID 就是起验证作⽤。

我们经常会看到这样的代码,这个 ID 其实就是⽤来验证序列化的对象和反序列化对应的对象 ID 是否⼀致。这个 ID 的数字其实不重要,⽆论是 1L 还是 IDE ⾃动⽣成的,只要序列化时候对象的 serialVersionUID 和反序列化时候对象的 serialVersionUID ⼀致的话就⾏。如果没有显示指定 serialVersionUID ,则编译器会根据类的相关信息⾃动⽣成⼀个,可以认为是⼀个指纹。

所以如果你没有定义⼀个 serialVersionUID, 结果序列化⼀个对象之后,在反序列化之前把对象的类的结构改了,⽐如增加了⼀个成员变量,则此时的反序列化会失败。
因为类的结构变了,所以 serialVersionUID 就不⼀致。

4. 序列化不包含静态变量?

序列化的时候是不包含静态变量的。

5. 有些变量不想序列化何如?

对于不想进⾏序列化的变量,使⽤ transient 关键字修饰。
transient 关键字的作⽤是:阻⽌实例中那些⽤此关键字修饰的的变量序列化;当对象被反序列化时,被transient 修饰的变量值不会被持久化和恢复。 transient 只能修饰变量,不能修饰类和方法

二、java序列化种类

Java 序列化⽅式有很多,常⻅的有三种:

  • Java 对象序列化 :Java 原⽣序列化⽅法即通过 Java 原⽣流(InputStream 和OutputStream 之间的转化)的⽅式进⾏转化,⼀般是对象输出流 ObjectOutputStream 和对象输⼊流 ObjectInputStream
  • Json 序列化:这个可能是我们最常⽤的序列化⽅式,Json 序列化的选择很多,⼀般会使⽤ jackson 包,通过ObjectMapper 类来进⾏⼀些操作,⽐如将对象转化为 byte 数组或者将 json 串转化为对象。
  • ProtoBuff 序列化:ProtocolBuffer 是⼀种轻便⾼效的结构化数据存储格式,ProtoBuff 序列化对象可以很⼤程度上将其压缩,可以⼤⼤减少数据传输⼤⼩,提⾼系统性能。

三、实际项目

在公司实际项目中,尤其是分布式微服务架构的项目中,定会涉及到服务间的通信、对象的传输,本公司用的服务间的通信方式为dubbo,由服务提供方提供代理client,并实现代理,使用方调用代理的方法就可以,就像是controller调用service一样方便快捷。但是遗憾的是中间的过程涉及到了rpc通信,需要传输信息,而传输信息需要用二进制流来传输,所以实体类需要实现接口才能传输信息,否则会报错。

在涉及到与某三方渠道,如微信,支付宝通信的时候,千万不能将sdk里面的实体透传至多个服务,因为sdk里面的实体很有可能没有实现Serializable接口


总结

总的来说实体类,或者实体类的父类,尽量实现Serializable接口,避免中间出现很多问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值