序列化和反序列化原理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了序列化和反序列化原理相关的知识,希望对你有一定的参考价值。

参考技术A 没有实现序列化的对象通过流传输会报NotSeralizableException

跨jvm传输的办法:序列化和反序列化
序列化:把对象(object)转化成特定的形态(xml, json),然后以数据流的方式传输
序列化不会自动保存static和transient变量
好处:减少对象的大小,对象传递的跨平台/语言
反序列化:数据流 ->特定格式(xml,json)->对象

private static final long serialVersionUID = -2975139301805213397L;
serialVersionUID是对象唯一的标记
若不指定serialVersionUID,系统会自动生成一个
关键字transient 修饰的对象,表示该对象不需要序列化
实际开发过程中,我们常常会遇到这样的问题,这个类的有些属性需要序列化,而其他属性不需要被序列化,打个比方,如果一个用户有一些敏感信息(如密码,银行卡号等),为了安全起见,不希望在网络操作(主要涉及到序列化操作,本地序列化缓存也适用)中被传输,这些信息对应的变量就可以加上transient关键字。换句话说,这个字段的生命周期仅存于调用者的内存中而不会写到磁盘里持久化。

HashMap

自定义序列化和反序列化方法,通过反射访问private方法

分布式架构下的序列化技术
1、序列化的数据大小(影响传输效率)
2、跨语言, json(对外接口的通信)/xml
对内的服务于服务之间一般使用:
1、hessian
2、msgpack
3、prototuf(压缩率非常高)(不易使用)
4、kyro
5、avro
6、hassian2(dubbo)
7、json(spring cloud)
8、jute(zookeeper)

JSON
Fastjson :序列化,和反序列化速度快,接口简单,易上手
jackson(spring mvc): 性能要比fastjson和gson要好,稳定性更好
Gson

hessian
性能、易用性要比默认的序列化方式要好
kyro、avro :大数据处理有使用,不能跨语言
prototuf:序列化数据非常小、传输效率非常高,每个字段会按照tag、length(可省略)、value进行序列化

序列化的选项:
序列化空间的大小,(空间)
序列化过程的效率,(时间)
是否支持跨语言
技术的成熟度

Dubbo序列化原理

参考技术A Dubbo序列化的默认方式是Hessian2,对应到源码里面的类便是Hessian2Serialization

在服务端,是在ExchangeCodec类中通过Hessian2Serialization来序列化或者反序列化数据

而在消费者端,除了通过ExchangeCodec类来序列化请求,还通过DecodeableRpcResult中的decode方法来反序列化请求结果

以上是关于序列化和反序列化原理的主要内容,如果未能解决你的问题,请参考以下文章

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

java 序列化和反序列化的实现原理

序列化和反序列化原理解析及ObjectOutputStream出现EOF异常分析解决

序列化和反序列化原理解析及ObjectOutputStream出现EOF异常分析解决

无法反序列化当前的JSON对象,为啥

深入浅出Spring原理及实战「开发实战系列」分析探究RedisTemplate的序列化和反序列化+泛型机制