00:00
行,那咱们来复习一下啊,打开EDI瑞看一下我们昨天讲的这样的一些内容啊,同时呢,我们梳理一下这个重点的这个内容是哪些,这个L流,那L流的话呢,我们昨天呢,就收了一下尾,把这就讲完了啊我们呢,一上来开始讲的呢,叫对象流,看就我们这一章呢,讲的流比较多,说到了几个重点的还记得吧,节点流得知道是吧?哎,最基本的这个流你得会操作啊,节点流完了后呢,缓冲流换完了以后转换流,其他这几个流了解,然后对象流那主体的就我们这几个,那read ma access file呢,相对用的也少一些啊啊这呢,大家就把这个难度,把这个重要性呢就降低就可以了,这几个里边呢,呃,像这个对象流,对象流呢,其实本身这个流,呃,还不算是咱们说的非常特别重要的哈,说我经常用object input stream或者output stream,这个其实还不是它的重心呢,其实是在这。对,就说的这个序列化的事儿,哎,就像咱们这个讲课我们也说过了啊,就像咱们讲这个叫tree set或者tree map的时候,哎,我们哎呦tree map的时候呢,咱们涉及到那这个你添加的这个数据,要是map的话呢,就考虑key,要set呢,就考虑你添的这个元素啊,得排序啊comparable啊compar啊,咱们的重心呢,不在这个tree map和tree set,重心呢在排序的两种方式,哎跟这个呢类似啊,重心不在对象流,重心在序列化,因为序列化只要呢,我们像这个客户端的两个进程之间,包括呢,我们浏览器跟我们这个后台服务器之间,要想传输数据,这个数据得是可序列化的啊,那这个可序列化,那就要求你传的数据可以是基本数列性,对吧,基本序列性本身就可序列话,是不是也可以传字符串,哎,那多数情况下呢,咱们传的其实都是字符串,字符串其中里边提到一种特殊的字符串,叫做杰森杰森格式。
01:59
这个字符串它是一种特殊格式的字符串,那有同学可能想,那我要传别的呢,比如我想传一个person啊,从我们这个客户端,比如说大家你会看到咱们这个手机也好,浏览器也好啊呃,你会看到这个手机为例吧,大家不是天天都用手机嘛,诶这里边呢,你看新闻也好,还是说你点外卖也好,还是说你买一个商品也好,这不都是一项一项的item,习惯上我们手机端呢,这不都是整个是一个列表吧,列表我就叫list了啊,整个是个列表,每一项呢,呃,其实呢,都叫一个item,这每一项其实都对应着我们说的一个对象。
02:35
比如你这是想买一个杯子,这个呢,就是某一个杯子图片名字,呃,价格,这个购买量,这个收呃收藏数或者评论量啊,这个几星的等等,这呢,刚才提到的这几个都作为我们这个对象的属性出现,我这呢整个就封装了一个对象,那大家呢,会看到我这个页面当中会存在很多的对象,这些对象呢,我们可以用list去进行一个这个这个重装是吧?诶前面已经讲到过了,那这是一个对象,这些数据大家也知道,不是我们本地存的,都是来自于我们后台这个服务器发送过来的,当然统计的数据呢,还在我们这个数据库当中啊,诶这个后台呢,其实是先我们这个浏览器呢,发送了一个请求,就是你打开的这个页面,一打开这个页面的时候呢,我们这个请求呢,就发出去了,通过网络的方式呢,来访问我们的后台,那后台呢,再根据这个请求,我们去访问一下数据库,把这个数据呢查出来,接下来呢,响应给我们的浏览器或者是客户端,那么响应过来的时候呢,大家也看到了,我这呢是一个一个。
03:36
的一个一个item,在咱们Java层面呢,其实就一个一个的对象了,那我们返回的时候呢,比如这是一个就叫商品了,哎,那其实我们返回的呢,不会是这个故好多对象构成了个list,说我这呢发list不会发list的啊,因为你要发list,首先list这个对象它得是可序列化的,对吧?然后呢,List里边呢,你是不是有一个数组,数组里呢,又放了好多的这个故字,是不是都得是可序列化的,咱们不是刚才讲到了序列化的一个要求嘛,对吧?诶你都得是可序列化的,那这里边呢,就会你要是这样传的话呢,那就成了啥了,咱们可能传的这个给这个客户端,你想你有好多的页面。
04:20
其实会有好多的一些类啊,好多不同类型的对象呢,那每一个对象呢,都去的话,都去的话还挺繁琐的,还挺繁琐的,那怎么办啊,对,我们把这个所有的这种你要传的这种对象,我全部给你转换成字符串,字符串天然就是可学化的,它已经实现了c releible了,所以我们都以字符串的方式去传啊,那这里就提到了,这故事怎么还能整成字符串呢?哎,这就提到了,任何一个类的对象,我们都可以转成一个特殊字符串,这个字符串呢,我们就叫做杰森,呃,这个杰森的话呢,比如说像这是一个对象啊,我们一个大括号里边这呢就放你的,其实就相当于我们讲过map了啊,这个杰森呢,其中呃具体的一个杰森对象,相当于里边呢,就是一个键值对构成了一个map一样,这个键呢,就是你这个对象的属性名,比如叫name,然后呢,诶后边我们用个等号了啊,哎,后边这个value呢,就是你这个对象的属性值,哎,你这个什。
05:20
牌子的这个这个水杯是吧?哎,然后你这个,呃,这个呢,我们名比如说叫URL,哎,这个就是你的key了啊,然后对应的这个value呢,就是你对应的这个HTTP什么什么什等,对应的是一个图片等等等等等,哎相当于我们一个对象,我这呢就是一个对应的杰森的一个对象,那我这有好多的这个对象,故S构成了一个list,那我杰森呢,还有杰森数组,好多的一个杰森,杰森对象构成了一个大数组,哎整体上我们外边加一个双引号,你这就是一个字符串,所以我们实际上发送的都是字符串,那到这块的话呢,我们再去解析一下,把这个字符串呢,给它解析出来,在还原成我们再一个一个的这个数据啊,通过这个key其实找到这个VALUE6了,那我们这块呢,再一个一个的给你填到这个对应的位置上,哎,这就呈现出来这个效果了啊是这样啊,这里边我们就提到了,这里都需要满足这个叫序列化体制。
06:15
啊,那对于客户端来讲啊,这是两个应用程序,那这个呢,比如叫联系人啊,这个呢,是你另外的某一个应用啊,大家其实也会发现我们手机里边呢,不管是啥应,其实基本上他都要获取很多的权限了,像权限里边基本上大家都会去获取的叫联系人的一个权限,那拿到这个权限以后,我们呢,就可以去在这个进程当中,是不是访问你这个进程里边的这个。数据了,那就联系人这个应用里边,这个数据底层呢,你存在很多的联系人,这个数据的话呢,我们就可以让他呢去获取,这相当于是进程之间的一个数据共享,那进程之间的数据共享比我们说的线程与线程之间的数据共享呢,要复杂一些,咱们前面讲这个多线程的时候呢,也提到过,呃,线程跟线程之间呃,实现共享的话呢,要简单一些,因为线程呃线程跟线程呢,它首先呢是在同一个进程里的。
07:11
啊,我们现场啊。共享什么呀,共享一个进程的什么呀,内存。嗯,就是这个点的话呢,大家算一个我们后边要讲的GM里边啊,咱们讲线程的时候说过,每一个线程它自己有一个独立的站。和程序计数器。回忆一下啊,然后呢,呃,一个进程中的多个线程,它共享这一个进程中的堆和方法区。回忆一下咱们说过这个事儿,呃,共享,呃,多个线程啊,共享这一个进程的堆和方法区,这是共享的,那你每一个线程呢,自己有自己的程序计数器和站,我在这个笔记里边应该也有写啊,这要注意一下这个事儿,那现在的话呢,就是我们提到叫进程跟进程之间的一个数据传输,数据共享,这呢就叫做序列化,哎通过这样方式实现的啊,行,这个我们就过了,所以这个重心呢,我们其实在这儿啊,那又又强调了一下,那好了,我们通过这个对象流的方式呢,进行讲解的,那首先呢,提到这个对象流,哎,这有两个流,哎,Object,诶,Input stream。
08:27
哎和object outp,诶stream行,然后呢,提到这个作用啊,诶作用的话呢,咱们这呢,应该也是,哎直接我们在这写一下吧,首先呢,这个叫object input stream啊主要的话呢,用它来做一呃,它是一个序列化还是反序列化,反序列化,所以咱们先说这个吧。哎,Object outpook stream,我们呢,能够把它咱们就直接呢,直接一点啊,就是内存哎中的这个对象,哎直接呢,我们转化成哎,哎转化成到这个文件中是吧?或者叫存储中的这个文件啊,或者呢,我们通过网络呢传输出去。
09:16
哎,这是这样的,然后呢,诶它呢是正好相反,哎将这个存储中的这个文件数据从这个文件当中,或者呢,这个叫哎获取,哎或者要通过网络传输过来,或者接收过来。哎,在呢,还原为诶内存中中的这个对象,哎就这样子啊好这呢是我们说的这个作用,然后这里边呢,我们这个箭头这块,其实就是一个序列化和反序列化的这个事儿,下边呢,重点我们提的叫对象的序列化机制,诶对象的序列化机制,这我就直接从咱们的课件里边粘一下了。
10:01
嗯,在这啊,大家呢,不要死记硬背啊,用自己的语言呢,能够描述清楚就可以了,看这样啊,对象的序列化机制啊,那这里边的话呢,提到了两个过程,序列过程和反序列化过程。嗯,这呢用它呢截了一下啊,前面的呢就叫做序列化过程,后边呢,对就反序列化,其实对应的就是这两个事儿啊,诶把这个过程呢,咱们称作叫序列化过程,行哎就说完了啊呃,下边这个叫序列化过程,呃序列化过程咱涉及到这个呃代码了啊,序化过程其实在这也也说这个事了啊嗯,我都我都写到这了,那直接我们这块呢来写这个代码实现啊。嗯,代码时间。来先看上边这个呢,是我们的序列化啊过程把它诶CTRLC粘过来,来粘到这就行行这块我们说一下这个核心的操作,核心这个操作呢,主要就我们这块调的这个叫right object啊,然后以它为一个典型,我们此时呢,Right出去的是一个person,诶write完以后呢,我们进行一个flash啊,从那个内存里边呢,让它显示的给它刷新到我们这个文件当中啊就这样,诶下边你可以写其他的一个对象,因为呢,我们这是write object,所以这个参数的话呢,只要是任何一个object声明呢都可以,那通过多态的方式,任何一个类的对象都可以往这放。
11:34
啊,都可以往这放行,这呢是一个叫序列化啊,然后接下来反序列化,反序列化的一个代码实现。嗯,CTRLC这样啊,这里边的话呢,上面叫bright,哎,我们这呢就叫做一个read,那read的话呢,我们这既然你写的时候呢认为是一个object了,所以读的时候呢也认为是一个object啊,那下来呢,也有同学问这个事了,说这个诶老师上面这块呢,你write一个string,这又write一个person,又write个person,下边我读的时候呢,第一个啊,我得可以强制成string,第二个呢,强制成俩person这个。
12:19
这是不是得必须得跟这一致啊,首先顺序得一致对吧?哎,我先写的什么,你这块呢,就得先取什么,其实也正常,你像我们这块呢,往这块写的时候呢,你先呃写了个string,呃,后写的这个person啊,又写了个person,所以我这块呢,序列化过来的时候呢,不也是先接收到这个string吗?那后接到这个person person,所以你也得这样的顺序去读啊,这是其一,那其二的话呢,有同学可能会担心说诶,那这我到底读几个,万一要是读多了呢,那可能就不对了,咱们就往里写了仨对象,你可定也就只能读三个,这是其一啊,其二的话呢,说我要是往这个序列化的时候呢,传出了好几个对象,不同类型的,那这块读的时候呢,我还得知道你这块给过来的分别是哪个对对象哈,比如你上面第一个是string这块呢,是不是你必须得知道第一个要强转也只能转换成四顿呢,你把第一个对象转换成person,编译不报错运行不就挂了吗?啊说这个事儿感觉还挺繁琐。
13:20
嗯,这呢,我是举了一个代码中的例子啊,说放了个string,放了person,甚至还放个别的,其实真正你要开发中去序列化,咱们说过了,基本上你要序列化是不是都是拿死顿序列化了,所以不会存在的问题啊,这是其一,其二的话呢,就即使你不用死顿,你用的是某一个别的类型,你也不会说呢,一会儿放个person,一会儿放一个dog,一会放一个什么account,你要放肯定是序列化,是一个类的对象啊。你不会说呢,放的都是乱七八糟的,就像咱们以后开发中大家用这个list,你用list的时候呢,我们去艾特对象,虽然说这个不加泛型的时候呢,是艾特不占类型,但是你开发的时候呢,你想想你这个例子,你怎么会放乱七八糟的各种类型呢?你放是不是肯定是某一个类型的对象,呃,你像这个,呃,你你在这里边说这是一个数据,这个数据这个数据这个都是某一个类型的对象,所以不会是乱放的啊,虽然咱们举例的时候呢,我艾特了一个123,艾特了一个AA啊,类型不一样了,是告诉能放,开发的时候呢,肯定都是一个类型的数据啊,都是某一个类啊造的这个对象,所以你就不用担心这个问题了,所以这块呢,你写的都是person啊,这块你读的时候呢,就都转换成person就完了,诶这样一个问题啊,行这呢,我们就提到这个序列化和这个哎,反序列化对应过程的这个代码,那接下来呢,就提到这个说要求满足的这个点,咱们刚才考试呢也考到了,那这呢,我们就说到这样一个问题啊,那把这个补充呢,我们也拿过来CTRLC。
14:47
哎,这样啊行,那这块呢,就不多说了啊,这个需要的呢,大家呢,这个如果要是去的话,某一个自定义类的对象需要呢,满足这几个点就行。
15:00
把这个包一下。
我来说两句