序列化

(以下论述皆以java为主)

有一段时间没学习了,今天拿起数据结构,偶然间翻到了类ArrayList,于是看了一下源码

/**
 * The array buffer into which the elements of the ArrayList are stored.
 * The capacity of the ArrayList is the length of this array buffer. Any
 * empty ArrayList with elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA
 * will be expanded to DEFAULT_CAPACITY when the first element is added.
 */
transient Object[] elementData;

transient??只记得好像是java关键字,马上Google,大概意思就是如果用transient声明一个实例变量,则该变量不参与序列化进程

什么意思?

 在java中,提供了一个serialization接口(一种持久化对象实例的机制),一个对象只要实现了该接口,这个对象就可以被序列化。     当我们持久化一个对象时,可能有一个特殊的对象属性,我们不想用serialization机制来保存它,即我们不想序列化该属性,于是就可以在该属性前添加关键字transient,这样在序列化对象的时候,这个属性就不会序列化到指定的目的地中。

在我们上面讨论的过程中一直出现一个词:序列化

       维基百科序列化是指,在数据处理中,将数据结构或对象状态转换成可取用格式(例如存成文件,存于缓冲,或经由网络中发送),以留待后续在相同或另一台计算器环境中,能恢复撤消先前状态的过程。

       百度百科序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象

概括:

(1) java序列化是指把java对象转换为字节序列的过程,与之相对的Java反序列化是指把字节序列恢复为Java对象的过程;

(2) 对象序列化的最主要的用处就是在传递和保存对象的时候,保证对象的完整性和可传递性。序列化是把对象转换成有序字流,以便在网络上传输或者保存在本地文件中。序列化后的字节流保存了Java对象的状态以及相关的描述信息。序列化机制的核心作用就是对象状态的保存与重建。

本质上来说,序列化就是把实体对象状态按照一定格式写入到有序字节流中,反序列化就是从有序字节流重建对象,恢复对象状态。

回到最初,我们为什么要这么做,为什么需要序列化??

我们知道,当两个进程进行远程通信时,可以相互发送各种类型的数据,包括文本、图片、音频、视频等, 而这些数据都会以二进制序列的形式在网络上传送。

那么当两个Java进程进行通信时,能否实现进程间的对象传送呢?答案是可以的!如何做到呢?这就需要Java序列化与反序列化了!

换句话说,一方面,发送方需要把这个Java对象转换为字节序列,然后在网络上传送;另一方面,接收方需要从字节序列中恢复出Java对象。

当我们明晰了为什么需要Java序列化和反序列化后,我们很自然地会想Java序列化的好处。其好处一是实现了数据的持久化,通过序列化可以把数据永久地保存到硬盘上(通常存放在文件里),二是,利用序列化实现远程通信,即在网络上传送对象的字节序列。

附加一个问题,序列化可以将数据保存在硬盘上,这和直接保存在数据库里(持久化)有啥区别?

先看定义:

      序列化:将对象转换为二进制流的过程

      持久化:将数据对象保存在介质上(先转成二进制再持久化)

两者目的不同:序列化是为了保存当前对象的状态便于重复使用。持久化是记录对象的某些属性或者状态。序列化偏向与程序运行状态,持久化偏向于业务属性状态

两者应用场景不同:序列化使用在游戏存档,rpc远程调用,缓解当前内存压力。持久化使用在保存业务数据时。

 

总的来说可以归结为以下几点:

(1)永久性保存对象,保存对象的字节序列到本地文件或者数据库中;
(2)通过序列化以字节流的形式使对象在网络中进行传递和接收;
(3)通过序列化在进程间传递对象;
 

未完待续。。。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值