00:00
好,这个呢,是咱们上午呢讲的这个转换流啊,咱们就说到这儿了啊,这个重点的话呢,其实还是咱们后边讲的这个字符集啊,字符字节转换这块这个内容啊,但从我这块来看的话呢,似乎呢,大家可能会感觉说我们在这个计算机层面,像这个英文的这个abcd呢,似乎呢,在我们实际存储,包括处理一些这个题目当中呢,似乎要更友好一些是吧,一方面的话呢,你看他占的字节数呢,比较小一些,另外的话呢,你像这个A是吧,加个一,诶他这块呢就能是B。哎,这个呢,在处理好多问题的时候,相当于这个字符呢,是可以做运算的,哎在咱们这个汉字方面呢,就不行了,你比如说这个中你加个一之上。啊,我来加个E是啥是吧,这个就完全就没有意义了,OK啊呃,其实这块呢,我们讲对于计算机来讲,其实呢,像这种拼音文字呢,是比较友好的。啊,就是组合嘛,因为计算机呢,是比较擅长处理这种抽象文字是吧,包括运算计算机呢是特别擅长的啊,但是对这个人来讲的话呢,咱们其实呢,是擅长呢,去对这种形象的这种。
01:00
结构啊,印象比较深刻,所以呢,像咱们这个汉字目前呢,应该也算世界范围内。嗯,我不知道是不是仅存的了啊。对,至少呢,使用人数上来讲呢,绝对是这个最多的了,是吧,这个象形文字啊,这种象形文字呢,其实对于这种人来讲呢,是比较友好一些的,你要让呢,让咱们这个人呢,去做一些运算,加减乘除算半天,结果还给算错了啊,但是让人呢,去出这种形象的一些东西呢,是比较友好一些,比如说这个你在路上正走着呢。啊,然后看到一个女生是吧?啊,这个女生的话呢,一转头啊,看了他一眼之后呢,这辈子也忘不了了。长得实在是太抽象了是吧?诶,一眼就记住了是吧?这个人呢,比较擅长处理这种形象的思维啊,但是你要让这个呃,计算机呢,去记住一张人的脸,实际上是比较难的哈。啊,包括呢,我记得是在什么时候,是咱们建国以后吧,这个有的一些这个专家呢,也提到了,说要不要把中国这个汉字呢,从这种象形文字呢,也改成这种拼音文字。
02:00
啊,因为确实呢,原来我们在用简体字之前的这种繁体字呢,写起来呢,确实比较费劲一些啊,一个字的话呢,得写半天是吧,说呢,我们也像西方学习学习换成拼音文字,还好他没有换是吧。啊,只是我们做了一些简化处理啊,做写这种简体的一个汉字了。其实呢,要真的改过来以后呢,其实想想还是一个挺大的一个阴谋一样啊,因为呢,你看咱们全国的话呢,从北到南疆域非常辽阔是吧,这个汉字的话呢,大家可能都认识,但是发音的话呢,是有很大不一样的。现在你要换成拼音文字以后呢,基本上就是大家南方跟北方,大家就。就不一样了,文化呢,就要断断开了是吧,因为大家呢,这个说的写的都不是共通的了。OK啊,包括呢,就是咱们看的那些,像以前的这个古人写的那些,呃,这个。对,比如说刻在这个骨头上的石碑上的那些文字,可能达到几千年了,我们竟然还可以翻译出来他当时说的是什么,因为都是象形文字嘛啊,但是你要是换成拼音文字,那就完全的就不知道是什么了啊,还是有一些区别的啊。
03:03
OK行,然后呢,关于我们这个转换流呢,这块有个课后练习题啊,这个题目呢,是这样子的啊,说到把当前model下的,诶当前Mo下呢,这块我们放了一个这样的一个文件。嗯,在这儿呢哈,这个文件的话呢,是一个GPK格式的,然后呢,我们复制到电脑桌面上换了个路径,然后呢,诶换个名,然后呢,把这个字数集呢改一改,就是基本的使用我们讲的这个转换流去实现就行啊在我们这里边儿呢,它是一个。哎,JBK的这样就看不到了啊,你要这块呢,点一下其实也能看了是吧。啊,这呢是六句话,这也不是我写的啊,这个是。呃,日本的那个叫道生和夫啊,他写的这样的六句六句话啊,对,其实我觉得挺好的,所以我就留到这儿了啊,好像前段时间也是刚去世啊。嗯,包括大家可能也接触一下他写过的那几本书是吧,叫干法。国法。还有一个什么。这两本呢,相对来说比较有名一些啊。
04:00
行,这个呢,我们就说到这了,这个题呢也不太难是吧,然后我把这个答案呢,就也放到这儿了,大家呢下来呢可以写一写啊OK。好,这个完了以后呢,接着咱们看下边这个流啊,这个呢叫对象流啊,这呢也是咱们讲的这些处理流当中啊,偏向于重要的一个流了啊好,那对象流这块首先回过来,哎,找到我们这个位置啊,讲对象流之前呢,这块我们也放了一个叫做数据流啊,先说一下这个数据流。说数据流和对象流的一个说明。说呢,如果呢,我们现在想把这个内存当中定义的变量,变量呢,当然我们就包括基本数类型的变量和引用数据类型的变量了,想呢把这些变量呢保存在文件当中,那怎么办呢?比如下边呢,先放在这些呢,就是基本数据类型这个呢词论类型这呢是我们自定义的一个类啊这样的一个对象了,所以呢,我想把这些数据啊给大家持久化起来。那就可以呢,放到具体的文件中。OK啊行,那我们考虑呢,使用使用什么样流呢。这里边儿呢,提到了有数据流和对象流两种流呢可以选择,那首先呢,我们说一下这个数据流,这个数据流呢,其实呢非常简单,它呢处理的都是字节了,所以呢是output stream和input stream,然后呢数据流数据叫。
05:13
哎,所以这块我们叫data auto和data stream。啊,比较好记哈,哎,当然呢,你注意呢,就是这两个流呢,它处理的这个数据的类型只能够处理呢,叫基本数据类型和死润类型。啊,基本数据类型和损类型,对于呢,我们一般的这样的自定义的类的这种类型啊,它处理不了。啊,你比如说下边提供这些方法呢,我们也能看到啊,哎,像到这儿啊这呢都是八种基本数据类型了,然后这个呢,处理的就是死罪类型。那UTF这就是返回的就是string类型了啊,然后呢,这个呢还可以去处理,这叫字节数组。额外多一种类型,然后呢,把这里边这个read呢,你改成一个RA,对应的就是我们这个输出的这样一个流对应的一些方法,所以在这里边我们看到呢,它没有一个像叫read object这样的这个方法,不能够去处理一般的这种对象。
06:02
那进而的话呢,我们就考虑呢,就不用这个流了。啊,那用谁呢?诶那就用我们下边讲的叫对象流,因为这个对象流呢,它除了能够处理我们说的这个普通的对象之外呢,它也能够将基本数据类型的这个数据进行一个读取和写入,那12G呢,就是这个,诶数据流能做的事儿,我们的对象流呢都可以做,那接着的话呢,我们关于数据流呢,大家做一个了解就行,主要呢,我们使用的话呢,就讲这个叫对象流。使用它呢就可以了,所以下边呢,就关于我们这个对象的一个使用的一个情况。OK啊行,那么回过来简单我们这块说一下啊,说这个数据流及其作用,这呢说的这个数据流首先呢,对应的是两个流呢,叫data output。Stream。哎,一个是它啊,一个呢,叫a data input。哎,Stream这样两个流这块我们说一下啊,这个是一个输出的行为的,所以呢,我们理解为呢,就是可以将。哎,咱叫诶内存中的这个基本数据类型的这个变量,或者我们叫死顿类型的变量。
07:10
那这个变量我们说呢,叫写出到,哎,具体的文件中。OK啊,然后这个data input stream呢,我们说呢,就可以将文件中。保存的叫基本数据类型的变量,或者呢是string类型的变量呢,要还原为内存中的这个。啊,或者叫呃。将文件中保存的数据是吧,也行啊。哎,数据要还原为。诶,内存中的啊,基本数据型变量或者死证型的变量,OK啊能理解这意思,诶所以说你这块存的时候呢,肯定也是这个类型的变量了,所以我们取的时候呢,也还原成这个类型。啊,那这两个的话呢,我们说呢,基本上都不用了,因为呢,他俩能做的事,对象流都可以做。啊,所以这块呢,涉及到我们这个对象流,首先呢是两个API对象呢,就叫做object。
08:03
所以呢,对应的这个类呢,就是object input stream。一个是他一个呢叫object。Put。Stream好,这呢,就我们对应的这两个类了啊,然后作用是什么呢?哎,这个我们就提到说可以读写啊基本。哎,数据啊类型的这个变量。啊,这个还有呢,我们说叫引用数据类型的变量。OK啊好,那这块呢,就显然它的这个功能呢,要更强大一些,那引数这变量呢,典型的就是我们说的类了,类里边就是对象,所以呢,我们可以呢去读写对象,OK啊,哎,这呢,我们就使用这样的两个类就行了,那这两个类呢,我们去读写数据的时候呢,这里就提到了一个叫对象的序列化机制。啊,这呢,是我们以前没有听说过的这样一个概念,说什么叫对象的虚拟化机制呢?来我们看下这个课件啊。
09:01
你在这里边写的。来我们一块儿呢,来理解一下啊,我把它呢CTRLC咱们粘过来。哎,说明一下。何为对象的虚化机制呢?那这呢有时候也是一个比试题啊,那你就把这段话呢给大家说出来就行了,说呢对象的序列化机制,它允许把内存中的Java对象转换成与平台无关的二进制流。所以呢,它是字节的方式啊,从而呢,允许把这种二进制流呢,持久的保存在磁盘上,或者呢,是通过网络呢,将这种二进制流呢,传输到另一个网络节点。这呢,我用了一个分段的一个分割符哈说呢,当其他程序获取了这种二进制流,就可以呢恢复成原来的Java对象。哎,大家看能不能看懂这个事儿。是吧,这个呢叫对象的叙事化机制,那我们刚才提到说这两个类呢,是可以来读写基本数类型和引用类型了,基本数类型咱们就先不说了啊,主要呢说这个引用数类型,典型的话呢,我们说就是类类型啊,类型里边呢就对象了,所以这块呢,我们主要呢针对这个对象呢,说呢可以呢去传输,可以读写在这里边,这个读和写呢,其实就是我们这里边提到这个虚列化的机制的问题了。
10:19
你比如说前面这个首先呢,提到了我们把内存中的对象呢,这不就相当于给它保存在磁盘上吗。哎,把内存中的对象从内存当中写到一个文件里边,这不就是咱们原来前面说的这个写的这个操作吧。把这个操作呢,呃,就理解成咱们的前一个过程,然后后一个过程呢,就是说诶这有个文件了,然后呢,我们还可以呢,把这个文件当中的这个,呃,持久化的这个对象呢,再还原到我们内存层面。这不就是一个读的过程嘛,就是。这就是咱们内存,或者我们说叫程序。哎,是不是这样一个过程,所以呢,诶这个线呢,前面呢,其实就是写出的过程,后边这个呢,就是读入到内存中的一个过程。把这两个过程加在一起,就是咱们的对象的需求化机制。
11:02
那前面这个写的过程呢,咱们还起了个名叫什么呀,叫序列化过程。后边这个呢,读的过程呢,也起个名叫反序列化过程。哎,就是这样的词,所以这块你看就提到了,说序列过程和反序列过程,序列化过程就是写出的过程,那我们用哪个六啊。是不是应该这个啊。哎,对啊,这个呢,我们说呢,需要呢去使用啊,这个流实现。啊,没问题,这就是写出的过程啊,在这个写出呢,具体的我们怎么指呢,就是将诶我简单来说了啊,因为咱们上面这块已经说的比较详细了,就是将内存中的Java对象。哎,是不是保存在这个文件中啊。诶持续化到一个文件里边,当然了,我们这一章呢,讲的就保存在文件中,那如果要是有网络的话呢,那就相当于通过网络啊,把这个数据呢,给它传输出去。啊。或通过网络呢来传输出去。
12:02
那那这个呢,就是写出的过程,其实呢,我们就称为叫序列化的过程。那么反过来啊说呢,我们现在已经把这个对象呢,保存在这个文件中了,那我们呢,把它在还原成内存中的一个对象,这个呢就需要读了,所以呢,我们需要呢去使用。哎,这样一个理由呢,实现。啊,这样是吧,哎,这个呢,我们说呢,将文件中的。哎,这个数据是吧,还原为。诶,内存中的。哎,Java对象。这儿呢,我们就称为它叫反序列化。这呢,我们是从文件里边,或者你通过这个网络传输过来的这个数据是吧,文件中的数据或者呢,是。网络。传输。诶,过来的这个数据还原为内存中的一个障碍对象。啊,这呢叫做反序列化。啊,这个咱们可以再脑洞一下啊,比如说嗯,好像有时候看到这种新闻啊,咱们都知道这个人的话呢,其实是有这个寿命之处的,是吧,从秦始皇那时候呢,就开始想这个长生不老了啊,长生不老无外乎呢,就是像我们这层面的这个对象,对象呢放在内存里边,内存中的数据呢,都是有生命周期的。
13:15
啊,那你不用的时候呢,我们说那就会GC给回收掉了是吧,那就相当于呢,说诶我们内存这个数据呢,就好比是这个人呀,是有这个寿命的,那能不能给它持久化起来呀。是吧,就跟我们生活当中说这个人呢,怎么能够长生不老一样啊。那平时呢,咱们说这个人呢,就会有一些很怪异的一些想法,比如说有时候看到那种新闻呢,说这个人有这种疾病,现在这个科技呢,是没法治疗的,说不行就给他。动起来是吧。啊,这个把它动起来的话呢,你可以理解成呢,就好比是给持有化了。就把它放到文件里边了,哎,这个呢,过程其实呢,就有点儿像咱们叫序列化的过程。啊,那哪一天呢,这个科技呢,水平比较高了,这个病呢,能够治了,然后再给大家解冻一下是吧,解冻了然后又是活蹦乱跳的一个人了,啊你可以哎这个脑洞一下理解为呢,就是一个反序列化的一个过程嘛。
14:07
是吧?诶,你可以这样脑洞的去理解一下啊,或者再换一个场景,这个还有提到说网络传输啊,这个的话呢,就有点儿像。这个这个大家看的那个动画片就哆啦A梦是吧。啊,哆啦A梦啊,不是有个这种叫时空门一样是吧。哎,或者叫时光机一样啊,说这呢是一个人,这还是咱们说内存层面一个对象了,然后呢,这块呢,你就诶进到这个门里边儿。接到这门里边呢,然后从另外的一个时空呢,就可以再出来了。哎,你可以想象呢,假设呢,这中间就是通过网络来连接的是吧,你踏进去的时候呢,就相当于呢,跟你序列化了。啊,你可能就以某种这个比如说原子的方式去呈现的是吧?诶然后呢,这就传输出去了,这个呢,就是一个序列化的过程了,然后呢,在网络的另外一个节点呢,还有一个门,诶这块你就呃把这个数据呢,读过来之后呢,再还原成你内存层面,或者就我们生活层面的具体的这个人,这就是一个反序列化的过程。
15:02
你进去的时候呢,就要序列化,出来的时候呢,就要反序列化。哎,就稍微的形象点去理解这个事儿,OK啊行,那这个完了以后的话呢,我们下边就来举例子说明了。在这个对象流里边呢,我们去新建一个类啊。叫object。哎,Input或者叫output。哎,这样的一个stream的一个测试了。哎,这么着啊。好,这个话呢,咱们你看咱们讲这个序列化反序列化,咱们先说哪个。是不是得先序列化呀?对,你得先把这个呢,先存到文件里边,然后我们才从那个文件里边把这个数据才能还原回来,所以得先有这个写出的过程啊,这个不能上来就先读了,因为咱没有现成的文件,所以呢现在用这个啊,所以呢这块呢,我们先来演示一下,这个叫序列化的这样一个过程啊,CTRLC啊过来。行,那这块我们就看一看啊,嗯,这块的话呢,我们得先把这个对象呢给它造出来,这个对象的话呢,涉及到了一个是我们这个流,另外呢,你想把它保存在哪个文件里啊,文件呢也得有。
16:09
哎,首先比如一个fair。哎,你有一个具体的file。哎,这么着啊,然后这个位置呢,比如我们就写成叫诶object的一个文件,这个文件后缀怎么写呢?比如就写成T也行,但是你注意呢,就是我们这个文件呢,它不是让咱们直接打开看的啊,你自己看是没有什么意义的。那假如我就写到这里边儿了,行,然后下边我们去创建这个流。Object output stream。处理的意思的话呢,我们得包一下现有的流吧。哎,你有一个file output stream,然后在这里边呢,我们就放我们这个file。这么着一个结构,这呢整个呢,如果我们看成第一步就是创建对象的一个过程啊,File对象和流的对象,然后第二步呢,就是我们写出的一个过程,也就是我们序列化的过程。
17:04
啊,写出数据啊,即为序列化的哎过程啊好,那这块我们拿这个OS点我去write,哎往外去写啊往外写的话呢,诶咱们提到了说他呢,实际上可以往外也写基本数据类型了,看这些呢,都属于基本数据类型嘛。诶,我这块就不演示它了啊,咱们写一个字符串吧。那这个字串呢,就是叫utf。那把这个呢,我们比如说写出去。啊,我们说一句话是吧。比如说这个叫。嗯,江山如此多娇是吧?对吧。来,再补一个。引。无数。英雄。竞折腰是吧,好这个呢,我们就写出这样一句话了,写出这句话以后呢,诶如果呢,你说写完以后呢,我就直接呢把它就写出去,咱们也可以呢,这块加一个叫flash是吧。前面咱们说过,就是刷新咱们这个内存了,好,所以呢,它有这异常,那咱们暂且呢,都可以给它死入死出去啊这呢我就写出去一个数据了。
18:05
好,写完以后的话呢,假设呢,我就不想再去写了,那咱们就OS点做一个close。那这不就给关掉了是吧,这呢就是我们写出的一个过程,好来我们这块呢run一下。诶执行成功啊,这个执行成功以后呢,我们对应的这个文件呢,就有了,就在这儿呢,注意这个文件呢,不是让我们打开看的啊。这就是他一个存储,你要想看的话,你得通过反序列化的方式去看。如果你要是就感兴趣呢,你打开一下也行。但是其实这个你注意不是让我们看的啊。好像你又认识似的是吧,嗯,OK啊,这个不用打开了就行,然后呢,接着我们说它的另外一个过程啊,叫做反序列化。现在的话呢,相当于我们把这个内存中的一个死针形的对象啊,就存储到一个文件里了,这个文件的话呢,只要一直在不删,那就一直会存在。好,那我们现在想把它再欢迎回来是吧。欢迎回来的话呢,我们也得先有对应的这个file了,那其实也是我们当前这个呗。
19:03
这样的啊。这是我们的第一步啊,然后呢,我们得需要呢,对应的这个输入流了,我们说叫object input stream。啊,O is,一个object stream,一个叫。然后把我们这个file呢,诶扔进去。这是我们的第一步啊,第二步就是我们读取文件中的对象。哎,这个呢,我们就称为呢,叫反序列化的过程。哎,主要呢,就说它了啊o is点哎,我们那就可以是瑞的一个啊utf。哎,这不就是他吗?好,这块呢,我们就得到了一个哎,死string类型的这样的一个对象了,那我叫ATR1吧。就行。好得到力对象以后呢,比如我们把它呢,打印到咱们的这个控制台上,我就输出一下了。行,最后呢,我们就是诶关闭资源了。这个OIs.close一下。哎,就可以了,好,这块有这个异常呢,我也是就选择roses了啊,来我们这块呢,做一个运行。
20:06
啊,大家看啊,这时候呢,就没问题。那就能读到我们这个内存当中。行啊,这呢,咱们是以read一个read或者write一个字符串这样的例子来说的啊,这块呢,我们如果要是一个一般的一个对象的话呢,咱们可以呢去write一个叫object了。你看可以这样子啊,那比如说这个write object,我们写出的这就是一个对象了,对象这块呢,我是不是还可以用这个字符串啊。啊,没问题啊,比如说我这块再换一个是吧。啊,轻轻的。我走了啊。正如我。啊,轻轻的来。你看这两居室的这个境界呢,完全不一样是吧?啊,这个徐志摩的啊,这个一看呢,就适合这个谈对象的。这个一看这个主席的这个境界呢,就很高了是吧?行这个呢,我们写完之后呢,也可以在这儿呢,再来一个OS点做一个flash。好,这个呢,写出去了,我们坐这儿,在这儿呢做一个执行。
21:04
这完以后呢,我们再回到这个位置啊,我们在接着上就可以去读了啊,在我们这块呢,因为你写出去的时候呢,是按照一个不来写的,所以这块读的时候呢。哎,我们也可以呢,Read的时候呢,就按一个object来读,但是呢,你知道它就是一个string,所以你还可以呢,做一个强转。这块呢,我们再alt加一个啊回车啊,现在有一场是吧。然后呢,奥加个回车,哎,把它强转成这个string。好,然后呢,你可以呢,再去打印一下我们当下这个珠串。走起。哎,看没问题。哎,真的就可以了啊好,那目前的话呢,我们就通过刚才这样的一个操作呢,演示了一下什么叫序列化过程,什么叫反序化过程。啊,对应的这个文件的话呢,我是写成T了,那你也可以呢,比如说就像体现呢,不想让他读啊,你可以换成叫比如说data啊这样一个格式也可以啊行,暂且我就先写成这个吧。
22:00
呃,然后呢,这块呢,似乎我们也没看出来,说要想实现序列化,说有没有什么样的一些要求了。因为这是我们用的string,有可能string呢,显然就满足一些要求,就好比是呢,前面前面呢,咱们讲这个,呃,使用呢,实现对象的一个比较大小一样。啊,当然的话呢,我们这个词缀呢,天然的已经实现了comparable接口,所以我们自然而然就能够比较大小了,但如果要是自定义的类的话呢,你发现呢,就不能比较大小这块的话,我们要考虑,如果呢是我们自定义的这个类的对象说是不是也会有一些要求,哎,事实上呢,也确实会,就我们下边要讲的自定义的类,要想实现这个虚拟化机制,需要满足什么样的要求?哎,我们就来说下边这个事儿了,好,那还在我们这个包下我呢,去新建一个,比如说我们就制定一个叫personally吧。扩散类里边咱们声明,比如说死针形的name啊,Int型的age,这个咱们都比较熟了,接下来呢,我们去设计它的内部的一些这个结构啊,比如说构造器哎,空参的一个。哎,然后呢,这个,哎,全餐的一个。
23:02
这块是吧,啊盖塞方法啊,愿意提供一下我们也可以啊好再加个toth string。行,基本的话呢,我们就先把这个类呢写成这样了,然后下边的话呢,我们看看我创建person类的对象,去序列化和反序列化,看看有没有什么要求啊,这块呢,我们还可以回过来,咱们就在下边来说啊,说呢演示自定义。哎,类的这个对象的序列化。啊,和反序列化的这样一个过程,OK。嗯,来看啊行,前边这块的话呢,其实区别不大,哎,我这呢就先整体呢,把这个呢先CTRLC咱们先粘过来。啊,这个呢,咱们先演示的话呢,还是一个序列化过程啊。那这个序列化过程的话呢,这块比如我们叫OBJECT1了,呃,咱这呢可以换一下,比如就叫data这个文件啊,这个就是你能看到的,就不是让我们自己去打开双击看了啊啊现在的异常呢,暂且我们也是给他先诶Rose一下啊这个呢没有问题,这块的话呢,我们就不这样去操作了。
24:07
哎,咱们直接呢,就诶person一个P一个person啊。这么着,在这里边儿呢,我们也指明它的这个属性,比如叫汤姆。12岁好,这呢是一个对象了,接着的话呢,我们就可以通过这个OS点,我们去write object,把这个拼音呢,就。给他切出去了。写出去以后呢,OS点我们来一个flash。然后呢,再去做一个关闭的一个操作。没问题。啊,这呢,就我们叫序列化的过程啊,好,那么序列化过程这块我们去执行一下,大家看看会不会报错啊走起。你看确实呢报错了啊哎,那这时候呢,他报的这个错误呢,叫notable的exception说那我们当前这里边这个person。对,就是叫不能够序列化的一个异常。啊,那这块呢,就提到了,说我们要想能够序列化,这怎么办是吧?诶这里边儿我们提到了,首先第一个点。
25:02
哎,这个我们需要呢,自定义类。啊,需要呢,实现一个接口。这个接口呢,叫sable。Able啊,这样的一个接口,好CTRLC过来,我们让这个这块呢,首先去implement一下,哎,这样的一个接口。写对了呢是吧,好,那实际上这个接口以后呢,你发现哎哟。怎么也没提示我,让我去重写,或者实现一下这个抽样方法是吧,那你点开这个接口呢一看。啥也没有是吧。哎,它呢,就是一个标识,没有任何的抽样方法需要你去重写,哎,那我们把这样的这种接口哈,起个名就叫做标识接口。啊,比如我们这个S,它呢,就是一属于一个是吧。哎,叫标识接口。阳呢,就是只要呢实现了这个接口,你也不需要呢,去重写什么样的方法就表示呢,我们当前这个类呢,是对应的对象啊,是可以呢序列化的了。
26:01
哎,就这个意思啊行,但是这里边你注意哈,我们这个呢,实现这个接口的时候呢,它这有个要求,你看往上翻的时候呢,他提到了,诶说我们当年这个level这个class,他需要呢,声明他自己的一个。CUID是吧,这个咱们在前面哪块讲过。诶对,下面我们讲自定义异常类的时候呢,当时咱们要求大家呢,在自定义异常类里边是不是得加这样一个属性啊。哎,说你要不加这个属性的话呢,就不合适了。啊,这块的话呢,其实就我们说到后边来讲,就是在这块的时候来讲啊,然后呢这呢需要我们去声明一个自己的叫zero u ID。然后呢,这个呢,你可以呢,是不是可以了,是必须是static final的是吧。而且呢是一个浪类型的,就这三个呢,是严格要求的。所以说呢,你前面这个访问权限的话呢,他就不做要求了。哎,是这个意思啊,那这会儿呢,我们说的这个,呃,常量有什么作用呢。哎,这个呢,其实既然是一个全局的常量了,就是归我们这个类所有的,而且还不能改,所以说这个常量的一个作用呢,就是用来唯一的标识咱们当前这个类的。
27:11
啊好,我CTRLC一下,现在这块呢,说明一下。啊,这呢,我们说的是第一个点是吧,然后第二点说呢,我们说要求自定义类啊,声明一个。哎,叫全局常量。哎,这个常量呢,就是我们刚才看到这个了,咱们把前面这个就去掉了。那就这样啊,然后这个常量化这个值呢,你就随便改一改就行了。呃,跟别人的这个类呢,不一样就行,OK行,那你像咱们说的这个,刚才呢,我们做这个序列化的时候呢,操作的是这个死顿了哈,死顿这个类呢,你打开之后它呢,其实也有这样的一个,哎。全局敞亮。这个权限呢,人家也说了,这个无所谓,只要能够唯一的标识这个类就行,所以你看string的话呢,也有这个呢,我们从来也没有用过这呢,就是诶要序列化这个string的话呢,它就要用到的这样的一个。
28:01
全局常量啊。好,那么大家可能会有想法说,这个全球常量到底有什么用是吧?来暂且的话呢,我先没有用。我现在没有用,咱们看一看会不会有什么问题啊。呃,那么咱们刚才呢,说白了只做了一个事儿,就是呢,给他呢,Implement一下这个事儿,我现在还没有加这个全局常量啊,没有加的情况下呢,咱们回过来。我在这个位置呢,咱们先去运行一下,大家看看行不行啊,都起。你看是不是可以啊。说明没问题啊好,那没问题的话呢,我们可能接下来就想说,那我就开始反序列化了,OK,咱们就做一个反序列化。哎,反序列化的这个过程啊,把它粘过来。这个我们叫一个四。好,那这个文件的话呢,还是这个文件,然后这块呢,用的这个流呢就不一样了,所以咱们就把这个第二个呢,咱们先给它粘一下啊啊CTRLC。哎,这个,哎在这儿呢啊。
29:00
CTRLV来好这个我这个tlc。嗯,过来了,然后这块这个流呢都没问题,然后这块的话我们把它删掉啊。咱们拿这个o is点的一个object,那就它了,咱们知道了里边存的是一个了,所以我就不声明是object了,我就直接呢写成person了。然后这块呢,有这个相应的这个异常呢,先抛一下,然后呢,在alt加回车,我们做一个强转。OK,然后呢,得到这个person以后呢,我们把它呢打印一下。哎,这呢,就是一个输出的一个操作啊,看还原回来对不对啊好,上面已经序列化了,我们这边呢,做一个反序列化。你看,哎,回来了。那这时候大家会说,诶,我们这个CUID也没啥用啊,没写着也没啥问题是吧。诶这块呢,我们要说一下这个事儿了啊,就是当我们啊,把这个person这个对象呢,实现序列化和反序列化的时候呢,如果我们实现了这个接口没有呢,去声明一个这样的全域常量的时候呢,实际上我们说呀,它会自动的给我们生成一个这样的权益常量。
30:09
但是呢,自动给我们生的这个全长量呢,在我们这个类呢,修改的时候呢。哎,这个全异常量的值呢,可能也会变。啊,这个时候呢,就不对了。啊就不对了,这呢涉及到一个什么样问题,大家你先看啊,先能不能理解这个事儿,这个我比如把它变长一点,咱们这样看啊。哎,咱们现在有两个过程,一个呢叫序列化过程,一个呢叫反序列化过程,咱们现在把它写到一个文件里了,其实呢,你也可以呢,是不是通过网络进行传输啊。假设呢,这个呢是我们的网络的,我说叫A这样一个节点啊,现在的话呢,我们这有一个对象,我把这个对象通过网络的方式呢,我给传输出去了。这个呢,是不是就是序列化过程。OK,好,那么这块呢,我们还有另外一个网络的一个B点啊。这个B点的话呢,把你传输过来的这个二进制流中的这个数据啊,我还原为内存中的一个对象了,这是不是就是反序列化的过程。
31:05
好,这个呢先明确一下。OK,这个呢是我们,哎存储的一个对象,这个对象呢,假设就是我们刚才用的那个person啊,就TOM12岁了啊,那这既然是个对象呢,对象呢,是不是一定有它所属的类,我们说了是不是叫person类。啊,这叫person类,然后呢,你把这个对象呢,给它传输回去,传输出去之后呢,在我们这个位置呢,给还原成内存中一个对象了,也是个person对象,是不是它也有个类型,也得是个person。那我们为什么要声明这样一个zero version ID的权益常量呢?就是说呢,我这呢是一个person类,你把它传出来以后呢,我也得还原成是一个类,这两个类呢,是不是得标识一下,得是同一个类呀?你不能说我通过包去区分,包呢,不靠谱。诶,我这块呢叫比如说诶爱的硅谷零五,诶这个包下的一个叫person类了,这块呢包也是这个,但是呢,有可能它是不同的类。所以呢,你这是一个person对象,你还原回来也得是个person对象,这个呢,Person得是同一个类,所以呢,我们就得用一个标识,用来唯一的标识这个类。
32:08
那这个标识是谁啊?就是咱们说的UID。哎,你这块呢,对象传输出来的时候呢,不就有这样的标识吗?然后我还原的时候呢,就还原成跟同样这个标识的这个类型的一个对象。啊,用来唯一的标识这个类的。那刚才我们提到一个点哈,说呢,这个person类呢,如果说你要没有显示的声明,它会默认给提供一个。刚才呢,我们就属于默认提供了一个,然后呢,我们发过来之后呢,这个呢,我们又把它读进来了,发现呢也没有问题,因为这时候我们这个。这个文件啊,或者这个类啊,咱们没有修改。如果呢,你要是修改一下这个类的时候。这个标识呢,它就会变,它要一变这块还没改。导致这俩标识是不是就不一样了?我再说一下啊,咱们下边说完这个事儿呢,我要演示了,就是你要是这个类呢,诶传输过来这块再接收都没变,那就还是一样的,大家这块可能看不出来了,因为咱们就写到一起了啊现在我这块用的person呢,是这个,这个用person呢还是这个。
33:08
哎,没加这个标识,但是如果说我们网络A的这个节点,我在序列化的时候呢,我把这个类给改了。里边比如说加俩属性是吧,哎,加俩方法,只要你修改这个类,那我们这时候这个标识就变了,那你当初序列化的那个,呃里边标识假设哈,是123这样一个浪型的一个全局常量了啊,然后这块你把这个呃文件呢一改假设它就变成这个256了。哎,你在这块再还原的时候呢,导致你那个文件呢,你发现再找变成256了,就不一样了。咱们现在因为用的是同一个这个文件都放在一起了,大家可能看不出来了哈,就是我现在呢,注意我把这个文件呢。看这了啊。我现在已经是序列化了,是不是已经写到我们这个文件里了吗。那那这时候呢,其实就对应着我们这个person呢,有一个。啊,这个序列的版本号了是吧。好,然后呢,我们这块再去读的时候呢,我这块还原是不是还是用的这个P。
34:04
它的版本号是一样的,所以呢,我们这块呢,在读的时候呢,你看回来是没问题的。好,下边我要去改啊,这个文件呢,我现在还用这个文件,这个文件我这块就不动了,现在我动一下这个类。比如A类的话呢,我们给它加一个属性叫ID吧。哎,我们这呢,比如说顺带着再补一个构造器。哎,构造器这块我们来一个三个参数的。那这样那盖菜方法呢,愿意提供一下,你就也提供一下也行啊。哎,针对于他,然后这个兔子瑞的话呢,我们也给他改一改。哎,比如说加上我们这个ID的这个场景。OK行,说白了就是我现在对这个类呢,修改了,这个修改以后呢,就会导致这个默认生成的权异常呢,就会变。好,他如果要变了,你看啊,我这个位置不动。还是用的咱们原来这个文件,这时候呢,它其实就会记录了一个,哎全局的一个常量了,那我现在呢,直接呢去还原,还原的时候呢,这时候是不是就用这个新的person了。
35:02
新的这个person里边这个ID啊,ID就变了,所以你看我这块一执行就挂掉了。有这样的一个异常。OK啊行,这块我们可以说一下啊,就在这里边啊,说呢要求自定要在这个一定要声明一个这个全局的一个常量,这个注意点呢啊,我们写到这儿啊。说,哎,如果。哎,不声明全局常量。啊,这个我先把这个粘过来啊,如果呢,你要不声明全心常量它。诶,我说呢,系统会自动生成一个。啊,针对于当前类的啊一个。啊,自动会生成一个啊说如果呢,这个修改此类的话。啊,会导致咱们这个CUID呢会变化是吧。啊,变化。
36:00
然后进而呢,导致我们这个反序列化时。哎,我说那叫,诶出现这样的一个异常。行,这个我们就说清楚了啊,所以呢,你看刚才我没有加这样的一个程序常量呢,我们看到这样的异常了,归结原因呢,就是我们没有生命这样的变量,现在呢,我们把这个变量给大家声明出来。诶,我们就加到咱们这个对应的person里边了,这个你放在哪儿呢,倒都无所谓了啊,这个前面这个权限呢,其实也不重要啊,写个私有的也行,这个值的话呢,你就诶改一改是吧。好,这个我加完以后,咱们再把刚才这个事儿呢,再复现一下啊,怎么复现呢,咱们不是刚开始的时候没有这个ID吗。哎,我把这个构造器呢也去了。把这个概率方法呢,我们也去掉。这个呢是原来的to string打开啊,这个呢我们也不要了,这不是咱们最初没有ID的时候呢,这样的一个类长这样啊好,那就意味着我这时候呢,把这个呢得重新的再去咱们。诶,序列化一下是吧,生成到这个文件里了,然后这是我们来这个反序列化。
37:03
啊,这没问题,这呢跟咱们刚才那会儿没加的时候呢一样,说现在的话呢,我加了这样的一个属性了。同时呢,我现在给大家增加一个字段。哎,增加一个构造器。Get赛的方法也加上了。然后这时候我们这个兔子瑞的话呢,也调整了一下。哎,这么着好,那么这个类呢,我就改了,改了以后的话呢,这个标识因为存在呢,所以这个值呢不会变啊,它不会变的情况下呢,我们这时候还是来这个叫反序列化啊,刚才不是报错了吗。现在我们在执行。那就没事儿。啊,这个呢,就是因为我们加了这样一个全球场的一个原因,行,大家呢,下来也不用刻意的去演示了,你就记住这个结论了就行。啊,没问题。好,那除了这个之外呢,说还有什么其他的要求吗?似乎呢,我们看不到了,我说呀,其实还有。什么要求呢?哎就跟咱们说这个叫时空门一样,这呢是这个小人是吧,他呢走到这个时空门里边呢,又想象成打成一个序列化的二进制流了,啊就通过网络呢去传输了,然后这呢再来个时空门,它呢,诶在出来就还原成我们哎生活当中的一个实打实的人了,这叫序列化,这叫反序列化。
38:13
哎,这时候呢,有什么要求呢,刚才说了整个呢,你这个对象所属的类呢,得加一个标识叫sable。啊,得有这样的标识了。然后呢,这个所谓的长链呢,你可以理解成你进去的时候呢,你再还原回来,我们这有好多的类啊。你这块呢,是哪个类进去的,你出来的时候呢,是不是也得找那个类里边的,哎,你还原成那个类的对象。所以这个类呢得唯一标识,你可以想象成就是这个zero ID啊。还有什么要求呢?哎,还有要求呢,就是你这个人的各个部分,我们可以理解成呢,这个人的各个属性。各个属性的要求也得是可序列化的。啊,这是这样了,这呢,就我们第三个要求。啊,要求。啊,自定义类的。
39:01
啊,自定义。啊类的啊,各个属性也必须是可。序列化的。诶,那既然有这个要求,那这块我们具体来说一下啊,首先呢,这里边儿提到叫基本数列型。诶,对于基本数据类型的属性。啊,这样来讲呢,我们说,诶默认呢,就是可以序列化的。啊,那这块呢,如果说对于银税类型的这个属性呢。那这个我们说呢,也要求得实现。哎,咱们这个这样的一个接口。哎,得有这样的要求,好,那么回过来大家你看我们这个P里边呢,因为呢,我们这个string呢,它天然的已经实现了这个哎C这样一个接口了。啊,另外的话呢,它这两个in特型的属性基本属于定性变量,天然的就可序列化了,所以这块我们就看不出来了。
40:00
啊,那我们比如说再给他增加一个这样的一个属性啊,举个例子啊,比如我们这个class,咱们对于这个人来讲呢,它有一个比如账户。啊,账户里边有个大型的一个余额。哎,有这样一个情况啊,然后呢,我们简单的给他,比如增加一个构造器吧。啊,再给他这块加一个,比如叫哎two string的一个方法。OK啊行,这呢是我们给这个account呢,这个类呢做了一个声明,声明完以后的话呢,我们说这个人的话呢,都有一个这样的账户,诶我们来一个account类型的。啊,那构造器这块我们也增加一个哈。哎,加一个这个构造器啊,参数呢就比较多了。行,那你要愿意改一下的话呢,把我们这个图呢,你也可以给他再改一改是吧。诶,这块我们再来一下啊,重写一下,我们这个图司把这四个属性呢,诶都算上好了,那这时候呢,我们person里边呢,就多了一个属性哈,那么回过来,哎,我们呢,再去做一个叫序列化的一个过程来走起。
41:00
诶,这时候你看诶没问题,这个呢,是因为我们也没有用当前这个。抗的这样一个属性是吧,然后呢,我们下边用一下啊。Person PR,哎,你有一个person。这个呢,我们来一个叫,哎,比如叫Jerry哈。哎,这个来一个23ID1001,哎,我们又一个account,哎这里边呢,余额比如2000块钱。这么着好,然后呢OS点我们去red出去,这个呢叫P2,然后呢给它flash一下。哎,没问题,好,那这时候我们就带了一个这样的属性,此时呢,我们再去做这个序列化。哎,你发现了,这不就报错了吗?这呢指的就是我们当前这个account,它呢不能够序列化。相当于呢,你这个人呢,你可以脑洞一下,他出去的时候呢,假设啊,脑袋胳膊。啊,这呢都是可序列化的,腿不能序列化,这个进去以后呢,那腿就过不去了是吧?诶所以呢,都得是可序列化的啊所以呢,回过来我们当前这个count呢,也必须得。
42:01
哎,它呢,一旦加了以后呢,是不是自然而然的这个属性也得加一下啊呃,就是我们当前这个常量。也得有。啊,这块我们就补到这儿,这个你这个稍微的改一改呗。啊,可以了啊好,这个加完以后。然后呢,我们再回过来,此时呢,你再去做一个序列化。哎,这就没问题了。好,那么这时候我们还可以呢,做一个反序列化。啊,比如说o is点我们再去read一个object。哎,再还原回来。哎,叫PERSON1了啊,这个我们再al加个回车。好,没问题啊,来,我们这周呢,再去做一个run。那这就回来了,哎,这个我们翟瑞吗,没问题。行这呢,就我们说的整个这个序列化的这样的一个反序列化这样的一个场景啊,真的就可以了。啊,就这样,就这几个要求行,然后这块注意点的话呢,刚才我们提到了说一定要加上这个zero u ID这个呢,大家也知道它具体是什么意思了啊,就是用来唯一的标识咱们当前这个类的。
43:12
啊,在这也可以写一下。呃,用来。哎,唯一的。哎,标识。诶,当前的类啊这样的一个作用,所以呢,我们这个异常的话呢,呃,你会发现呢,为什么我们要给他加标识呢?因为它都有可能会做这种序列化和反序列化的这样的操作,所以呢,我们都会加上这样一个标识,OK啊。好,这个完了以后呢,这个注意点呢,我们这儿呢,多写一个哈,什么样的注意点呢,我们直接看一下这个课件啊。课件里边呢,在这个位置啊,写到这个事儿,兄弟,如果我们当前这个类的这个属性默认的话呢,是都可序列化的,如果你要是某一个属性呢,不想序列化了。你就可以呢,给他加上这样的一个关键字的修饰啊。Transit。啊,加上一个修饰,另外的话呢,就是如果我们当前这个类里边的这个属性呢,是一个静态的,那么静态的这个属性的话,也不会序列化。
44:08
啊,就是这样的特征,来回过来,比如说哈,咱person里边呢,往上走。啊在里边,比如说我们这里边这个name和这个age这个的话呢,假设我们加上这个叫。哎,Transit了。加上他了,然后呢,这个位置呢,我加了一个叫做static了。诶没问题,好,加上以后的话呢,那么回过来我们呢,还得去再序列化一下。嗯,好了,然后呢,我们在反序列化,嗯,你看刚才我们那个时候反序列化的话呢,都有对应的这个属性值哈,那么此时的话,你会发现呢,这个我们是加上这个transcent了,没有了,然后这个呢,因为我们是加上这个叫static了,就也没有了。就是这样个情况啊,好,我们在这写一下。哎,说呢,这个类中的这个属性。
45:03
啊,如果声明为。Trans。哎或sta立克,诶则不会呢,哎,实现序列化。言为这呢,就是说我们这样生命的这个属性呢,它呢不会就对应的这个属性这个值不会给你保存在对应的这个文件里了。啊,为什么回头来说一下啊,就是这个穿的话呢,你就这样来理解它呢,表示的就是一个叫瞬时的一样啊,就是你只要是加上这个修饰,那我们这儿就不保存了,它的作用呢,也就是这个。那死在这个这个为什么我们声明完以后呢,它不会保存在这个文件里呢。哎,因为这个属性呢,是不是跟这个对象无关呀。哎,咱们这个类,哎是什么样的呢?类里边自然而然就会保存着这个属性的值啊。本身呢,我们这个new的对象,咱们说呢,你这是占,这是对咱们new的这个对象呢,对象这个空间里边本身也不包含我们这个静态的这个值是吧?呃,然后这呢,是跟我们这个类相关的哈。
46:02
诶,JDK7以后呢,我们都是有个叫静态域,虽然说也在堆空间了,但是跟这个对象本身就没关系,诶所以这块你加上static的话呢,这个值也不会跟你存储到文件里边。那就这样个情况啊,好这呢,就我们说的这个对应的这个序列化机制相关的这个内容。这个说完之后呢,大家可能会有点儿迷糊啊,说我们讲这个对象流,好像我们平时也不怎么用是吧?嗯,那讲这个序列化机制说了这么多点有啥意义呢。诶,这块你注意哈,它的意义呢,就在于。啊在于什么呢,这块呢,有两个场景,第一个呢,就是我们通过网络的方式哈,这个呢叫客户端或者叫浏览器,咱把数据呢发出去给到我们这个后台。然后呢,后台这块呢,我们也可以把这个,比如通过数据库查询到这个数据呢,返回给我们的客户端,或者叫浏览器,那么这个传输的过程呢,我们说使用的是网络,这个网络中的这个数据的传输,如果你传的是对象。那么自然而然就要求这个对象得是可序列化的。
47:02
啊,这个注意这边我们就通过网络去传输这个数据嘛,这个数据呢,就是二级引流的方式去传输的,你要是对象,那这必须得可取的话。那么我们实际在开发当中这块传的时候呢,一般咱们都不会去传像这种自定义类的对象了。如果你要传的话呢,那就得跟刚才提的这个机制一样啊,刚才说的一些怎么实现呀,怎么注意啊,这样一些点了,一般咱们传都传什么呢。都穿。啊,诶都传这个尺寸,你比如说咱们这是一个客户端。啊,咱们讲这个集合的时候呢,这不都有对应的那个图吗。哎,稍微的看一下啊,嗯,集合。打开。诶看这是吧,这个呢是我们叫客户端了,这个呢是我们的一个网页了,OK,然后呢,我们看到的是不是都是这些数据啊。这个数据的话呢,哎,咱们前面提到过啊,说这呢,其实你可以理解成是一个对象了。
48:00
这个对象嗯,就是我我我这么着一下吧,就以他这个图为例啊。诶把这个事儿我们说一下,大家就知道它到底有什么用了啊这个呢,就相当于是我们客户端,你可以理解成就是前端了啊,这些数据反正你看到的其实都是来自于我们具体的数据库了,通过网络的方式呢,后台查完以后呢,给你展示出来的,好那么这个数据呢,如果你要是理解成是某一个类的对象啊,你说我就想传输对象,那这时候呢,这个类的,这个类的话呢,得要求按照我们刚才写的这个事儿。得去这么着是吧,得去注意这个点得这样来了,但是一般的话呢,我们传输的时候呢,都不是拿这个对象来传输的。啊,就是你自定的这个类的对象,咱们都传输的是这种字符串了,就相当于呢,我们这呢,比如说整个大括号,这呢我也整个大括号是吧,这个大括号里边呢,比如说针对于咱们这里边儿这个数据呢,其实都是建值对特点的了,这呢,比如我们这个呢叫name。哎,这个name呢,我来个冒号,后边这个呢叫哎好伦哥什么什么是吧,这不就其中的一个吗。这意思吧,啊,这是一个,然后后边呢,我可以再去写一个,比如说这个叫呃,几颗星这样一个K,然后对应个value,以此类推,就放到这儿,这儿呢是一个,然后下边是不是又是一个。
49:10
我就用一个大框去链接。然后这呢,彼此之间呢是多个,我们说原来呢讲这是一个历史了,那你就是这个逗号一下啊,这个完了再逗号一下,这不有多个吗。哎,整个这块的话呢,呃,其实就构成了我们一种特殊格式的字符串了,这个我们就称为它叫杰森格式的这种。字符串,哎,整个呢,我们加一个引号。来引起来,所以呢,我们在通过网络传输的时候呢,本质上来讲,它其实是个字符串。但是这些字串呢,它是有特殊的格式的。这种特殊格式的字符串呢,就叫做杰森。哎,那么我们通过网络呢,比如后台,前台跟后台交互的时候,我们传输的都是拿这个杰森格式来传输。OK啊,然后呢是字符串的嘛,字符串呢天然的就可序列化,所以你来回传输呢,没有任何问题。这个接的话呢,因为它是特殊格式字符串,怎么去解析还原回来呢,我们还有相关的一些这种小的框架或者小的插件。
50:05
比如说比如说fast,杰森啊,Goen啊等等的一些插件,我们非常方便的可以把这种组串呢还原成对象,然后你再给它一个一个填充就可以了。啊,这就我们讲的它的一个意义啊,这是一个情况,另外的话呢,就是咱们以手机为例哈,手机的话呢,我们提到过一个手机的APP呢,可以理解成就是一个进程嘛。啊,然后呢,这呢假设个进程一,然后呢,你还有另外的一个APP,这个我们叫进程二。前面的话呢,我们讲多线程呢,提到过,说呢,进程当中呢,是有多个线程。多个线程呢,是不是共用堆空间?所以呢,进程当中呢,多个线程通信很方便,当然呢,因为你有共享数据呢,我们说要解决线程的安全问题是吧?诶当然呢,我们还提了一个说进程跟进程之间通新呢,就比较麻烦一些啊,因为呢,这一个进程,这是另外一个进程,比如说呢,这就是你这个联系人的这样一个进程里边有很多联系人了,然后呢,这呢,假如是你的微信,微信呢,就想读取你的联系人,这时呢就是有进程之间的这种通信,进程之间的通信呢,也需要呢,以传输的方式呢去进行啊,也是流的方式的,那么它的传输方式跟咱们说的客户端和后台这个服务器端传输呢是一样的,如果你要传输的是对象,这个对象也得是。
51:17
可序列化的。啊,所以这呢,就是我们讲的这个可序列化的它的一个意义所在,可能呢,我们这个对象流呢,不一定大家会用,当然呢,我们这个序列化和反序列化这个过程咱们是要接触的。啊,技能之间通信,客户端跟服务器端之间通信,只要呢,你涉及到是以对象的方式进行,那都得是要求这个对象所属的类得是可序列化的。咱们的意义呢,可能就在这儿了啊,哎,当然了,我们刚才也提到了,说以后用其实用的都是润了,你知道呢,润天然就可以就行啊。
我来说两句