浅析Java 序列化与反序列化

序列化是将对象转换为字节流以便存储或传输的过程,涉及Java序列化、Hessian和JSON。Java序列化简单但不安全,且序列化后的数据量大、性能低。Hessian提供跨语言支持,但可能导致属性覆盖问题。JSON序列化则具有良好的可读性和广泛的语言支持,是目前主流选择,如SpringCloud和Dubbo。然而,Java序列化由于安全风险,通常不推荐使用。
摘要由CSDN通过智能技术生成

什么是序列化?

两个服务之间要传输一个数据对象,就需要将对象转换成二进制流,通过网络传输到对方服务,再转换成对象,供服务方法调用。这个编码和解码的过程称之为序列化和反序列化。

序列化就是把 Java 对象变成二进制形式,本质上就是一个byte[]数组。将对象序列化之后,就可以写入磁盘进行保存或者通过网络中输出给远程服务了。

反之,反序列化可以从网络或者磁盘中读取的字节数组,反序列化成对象,在程序中使用。

序列化类型

  • Java 序列化:默认通过 Serializable 接口实现序列化,只要实现了该接口,该类就会自动实现序列化与反序列化,该接口没有任何方法,只起标识作用。
  • Hessian序列化:Hessian 序列化是一种支持动态类型、跨语言、基于对象传输的网络协议。需要注意的是,Hessian序列化会把复杂对象所有属性存储在一个 Map 中进行序列化。所以在父类、子类存在同名成员变量的情况下, Hessian 序列化时,先序列化子类,然后序列化父类,因此反序列化结果会导致子类同名成员变量被父类的值覆盖。
  • JSON序列化:把对象转化为JSON字符串形式,JSON 可读性比较好,方便调试。

一般不建议使用Java序列化

目前主流框架很少使用到 Java 序列化,比如 SpringCloud 使用的 Json 序列化,Dubbo 虽然兼容 Java 序列化,但默认使用的是 Hessian 序列化。

  • 限制Java,无法跨语言
  • 易被攻击,对象是通过在 ObjectInputStream 上调用 readObject() 方法进行反序列化的,它可以将类路径上几乎所有实现了 Serializable 接口的对象都实例化。这意味着,在反序列化字节流的过程中,该方法可以执行任意类型的代码,这是非常危险的。
  • 序列化后的流太大
  • 序列化性能太差
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值