Java序列化和反序列化的理解

我曾经一致认为序列化是一种关乎对象属性顺序的东西,比如前后端互传数据的话,序列化可以帮助属性的排序按一定规则,但我查过几次都没有找到明确的答案,也不能怪我有这么奇怪的理解,属实是“序列”这两个字太混淆视听了,直到今天我才算有点正确理解了。

言归正传,Java序列化可以理解成是一种加密措施,这个东西的目的是为了统一格式、化整为零,因为java的对象类型是无数的,包括自定义的,如果按格式去输出到磁盘未免太复杂了,所以通过序列化就可以统一成二进制的格式。

序列化:对象>>>>>>压缩成二进制字节流>>>>>>输出到磁盘
反序列化:磁盘>>>>>>二进制字节流>>>>>>对象

具体实现方法是实现一下Serializable接口,但这是个空接口,应该仅是做出标识这个类需要序列化,然后要定义一个serialVersionUID,通过这个值的不同,去实现不同的序列化规则,可以把这个理解成rsa加密的那个密钥,反正我理解是起到差不多作用,这个不定义也行,有个默认值。然后就可以建一个对象,这个对象也可以是一个List<>什么的,只要类型是序列化的类就行,然后往里面赋值,最后就整个输出到磁盘上,输出之后会发现文件里是一堆你看不懂的乱码,这个就是根据规则生成的,反序列化就是读这个文件,把这堆乱码还原成能看懂的对象,逻辑很简单,代码也很简单可以自行百度。

有几个点要说一下,如果一个序列化类里有不想序列化的属性,有这几种操作方式:属性用transient声明;属性用static声明,因为static是和类绑定的,而序列化是和对象绑定的;一个父类没有序列化,但它的子类序列化了,子类会继承父类的属性,那序列化的时候也会忽略掉父类的属性。还有就是输出到磁盘以及从磁盘读入,我以前实践的就是导入导出这种功能,都是用字节流实现的,因为导出的文件要让用户能看懂,还要有格式、说明内容什么的,这就是区别所在,序列化生成的内容直接看是看不懂的,有一定的安全性,而且它只需要对对象进行翻译就行,只要它自己能翻译过来就行。最后就是serialVersionUID这个东西,因为它是规则,假如你序列化的时候的值跟反序列化的时候的值不同,那它就没法翻译,会抛异常,这个很好理解,它会自己识别。有个有趣的东西是我如果序列化没有实现Serializable接口的类,它会抛异常,但是文件里会有,这是为啥呢,明明搞了又说自己没搞zzz,但是再加上实现Serializable接口也还原不回来,毕竟这玩意儿得需要serialVersionUID。

最后是说反序列化也有一定的不安全性,它是为了还原对象,但是有可能用力过猛,导致出问题。

浅要理解,请多指教!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值