00:00
好,我们来说一下反序列化,那反序列化呢,我们先做一个基本的介绍,何为反序列化?现在把这个反虚化概念给大家聊两句。Jason的反序列化,它是指将接省字符串反序列化成对应的数据类型。能理解我的意思吧,就说比如说你原先你原先在这个进行,原先它本身是一个结构体,对不对,它结构体呢,你把它序列化了,序列化过后呢,成了一个节省字串,然后呢,你通过网络或者通过什么方式传送到另外一个这个程序,比如说是浏览器,那么这个浏览器呢,他拿到这个基层串过后呢,他可能会根据他的需要,他会把它还原成数组或者是结构体。啊,当然我我我举个例子啊,那在在我们这个浏览器这边呢,它肯定不会把它还原成结构体,因为浏览器它没有这个结构体的概念,我只是举个例子啊,举个例子,那反正就是说你这边拿到一个字串传给了另外一个程序,这个程序呢,他希望能够把这个节省串。
01:09
把这个节省串重新返回成原先的数据类型,那么这个呢,我们就叫做反序列化,能解,其实反序列化就是序列化的一个逆向操作,能理解吗?那也就是说我在这里说的这个概念,将节省字串反序列化成对应的数据类型,比如说原先的数据类型,比如说结构体map和切片。好,这是它的一个基本介绍,来,我们先把这个概念给大家反述一下,然后呢,我们举例说明。O了,好的,那现在呢,我给他一个。标题标题二,我们刚才做了一个基本的介绍。对不对,说了一下反序列化它的一个概念。它的一个概念。那反吸的话是什么概念呢?刚才我已经说了一下,来把它整理一下。
02:01
其实就是一个逆向操作。其实就是一个逆向操作,那有了这个概念过后呢,我们来讲一些应用案例。我们来讲几个应用案例。好,这个应用案例呢,我这布置了这么一些,我们这里介绍一下,将节省字串反序列化成结构体。反序列化成map。反序列化成切片,也就是说把我们前面序列化的那几种结构体啊,序列化的那几种数据类型重新反序列化成。对应的数据类型,这个就是我们待会儿要讲解的案例,来吧,同学们,我们每一个举例说明好,代码演示。来跟上老师的思路啊,跟上老师思路好的,那打开我们的Vs code,我新建一个文件夹。哦,干脆我们就在这个节省里面写吧,啊那反学的话,这个单词呢,可以有两种写法,第一种呢,就叫once。
03:07
On,这是一种写法,还有呢,干脆你就用这个也行,On Mar。也可以,就看你的需求啊,就是on maral或者是once都可以叫做反序列化,OK,好,那么我就叫on marsh吧,好不好?因为我们这个函数刚好是maral,它反序列化的那个函数呢,是on maral,好,我这样子就保持一致,好朋友们来跟上老师思路,建一个文件main.go。没问题吧,好的,那我把前面这一部分通用的代码呢,先拿过来为我所用,好,我写一个主函数,注意听讲啊。好的。拿到了,那现在呢,我们先演示第一个案例。啊,演示对演示。反序列化将。将什么呢?将这个杰森字串。
04:02
字符串。反序列化成反序列。反序列化成什么呢?结构体好,那我就写一个函数了啊,同学们注意听on Mar。啊,Mar什么呢,结构体。能理解。那同学们,既然我要把一个接绳串反序列化成结构体,那我这地方首先应该先拿到这个字符串,那字符串在哪里呢?好,同学们,我们。我们就拿一个字符串好吧。我们就拿一个字符串,比如说。我们拿一个这样的字符串。对不对。好,我们就拿上面这个吧,啊,拿上面这个。没问题吧?我们拿上面这个,那我首先拿到这个字串了。没问题,那因为这个字串里面呢,它有双引号,所以说我先把它怎么样转一下一。转移一下,这个大家能理解吧,因为你这个双引号里面再有再有双引号,我们需要转移符进行一个处理。
05:05
好,这块呢,我把它进行一个转移处理。这个大家应该能能够理解。好,写完了。好的这块就OK了,我们拿到一个字串。那现在拿到这个字串,你们怎么理解呢?你可以这样理解啊,同学们注意听,还是看这个图,你相当于说我们以这个为例,我们以这个为例,比如说A客户端。把一个结构体序列化过后呢,成立一个字串,通过这个后台服务器传给了这个B客户端。那么B这个客户端呢,就拿到了一个什么呀,拿到了一个反序列,拿到一个节省字串。是不是他就拿到一个精神字串了,注意这个阶阶层字串怎么拿到的,这个是通过网络传输过来就行了,我这里呢,因为演示,所以说我就直接相当于直接写了一个字串,但这个字串呢,它是满足这个。序列化过后的这个规范的能理解啊,你你不要说,哎韩老师这个这个字串怎么来的,我就是模拟嘛,对不对,那实际上这个字串在真实的开发中,肯定不能像这样直接写,肯定是通过网络得到的,对不对,或者通过通过一个程序程序去读取的,能理解吧,你不能说老师这样写你就蒙圈了啊,说以后咱们是不是都要这么去写,不是啊,这只是一个模拟啊。
06:24
我说明一下,说明这个是最。一啊是在真实的,在项目开发中,开发中是通过。是通过网络网络传输获取的。传输传输获取的啊,获取到的。能理解啊,理解或者是通过一个函数读取到的,或者是读一个文件读取到的,当然也可能是或者啊,或者是通过是读取文件,读取文件获取到的。
07:00
好,那显然不能直接这样写,我这是为了演示,我为了演示一个案例,所以我直接写了一个字串,能理解吧?好,那么怎么样把它反序的话呢,非常的简单。那首先呢,我们这个结构体你还得把它拿过来,也就说这个结构体的定义你肯定是跑不了的,能理解吧,好,把这个结构体定义拿过来。因为你要把它,你要把这个字串反序列化一个monster,那你肯定要有这个结构体的声明和定义,你你没有这个,没有这个结构体的这个定义,那你肯定没有办法把它。把它这个反修化成monster,这个必须要有啊,如果没有那肯定跑不起来的,好,那么这块呢,我就先把这个反射机制,把这个tag标签拿掉。拿掉啊,OK,当然你也可以保留,这个也没问题,也没问题啊,你要保留也是一样的,好,这个就做完了,那做完以后呢,我们现在就来反序列化,怎么反序列化呢?首先我们定义一个。OK,我们定义一个monster的实例。
08:04
这个没问题吧,Monster。好,第一个master写完了,然后呢,我们就调用Jason里面的一个函数,叫什么呢?On Mar。A Marshall。反序列化,那这个UN里面可以接收什么参数呢?可以接收两个参数,一个是这个字符串对应的什么呀?它对应的这个BAT数组。要把它重新换成这个BAT数组,呃,BY欺片。然后呢,这个把这个再传进去。因为你要改变它嘛,所以说你要用引用的方式传进去就可以了,最后这个返修掉过后呢,会返回一个信息。如果这个error不等于neal,就说明反虚弱化失败了。大家去看一下啊,这个就叫反序列化,它这里面会接收两个参数,一个参数就是你的这个字串所对应的BY切片。
09:04
另外一个呢,就是你要把这个字符串反序列化过后,把这些东西交给哪一个。呃,改变哪一个结构,呃改变哪一个结构体变量,所以说这地方大家看到是引用传递。如果你不用引用传递,那你这个地方是改变不了它的值,因为只有引用传递才能改变这一个函数外面的这个参数,这个在以前是讲过的,对不对?好,我们可以把这个on Mar再给大家看一下,看一下它的这个代码。啊,这个我就干脆就我这儿可能一时半会上不了网啊。好,我这就暂时不去上网了,好吧,告诉大家就行了。这个大家应该也能看懂,很简单对吧,就说我们要反虚拟化的是这个字串。但是呢,要把它转成这个bit切片。然后呢,整个字串反虚列过后,我们要把整个反虚化的这些数据传给这个monster。
10:02
那这个monster呢?我要用引用的方式传进去,这样才能改变函数外面的这个monster,这个这个实例变量能理能理解吧?啊好,我就做一个判断,如果L不等于利,说明我们反序列化失败了。那么我就把这个信息打出来,PTF,好,我输出一句话叫做marha。On martial e。等于。说出来好,换一可行,注意听啊,122好,这个就反虚化成功,反序列化过后呢,我们来看看这个monster到底是不是已经拥有了这上面的数据,来做一个做一个输出。好,我做一个输出啊,就是反序列化后。版序列化。后我们这个monster。等于什么来说一个。那为了好看呢,我这儿还是给他打一下啊,叫monster。
11:03
好,我们,我们来玩一把。我们把这个呢,我这调一下,大家看效果。好,这个地方因为。是这个,那就要加F。对不对,加F。好,我们现在呢运行一把。CD。点点。对不对,然后在CD Mar DR。然后go让我们的命顶勾跑起来,大家看效果啊。我们可以看到,当我们反序列化过后呢,这个结果跟我们想的是一样的,你看他已经有年龄。有这个生日有这个,诶名字到哪去了,我们看看啊,名字为什么没有看到。哦,大家看为什么没有名字啊,是不是因为我在这儿粘贴的时候没有把这个名,没有把这个名字粘过来啊,为什么没有名字呢?为什么没有名字呢?这是少占了个名字啊。
12:03
啊,你看我粘的是这块,这块呢,是刚才我们在演示的时候故意把那个名字拿掉的,对不对,所以说我应该重新粘一份才能看到名字粘这上面这个啊。是不是这个四串里面才有名字好,因为因为如果再重新粘一次的话,比较浪费时间,我就干脆只粘这一块好不好,只占这一块相当于说增加了一个,呃,增加了一个KY6嘛。这个大家应该也能理解,好,我把这个改一下就行了。把这个名字放进去啊。放进去。放进去。放进去。对不对,好了,我们再运行一把,我们再运行一把,大家看效果。跑起来。跑起来,我们可以看到,这时呢,这个名字也就过来了。对不对,所以说这个反虚化实际上就成功了。反修的话就成功了啊,当然既然它已经变成了一个结构体的变量,那你也可以取出它里面的每一个字段,比如说我只想取取出其中的一个,比如说它的这个名字。
13:07
你也可以这样取。因为它已它已经是一个结构体了嘛,所以说你像这样取也是没有问题的monster name。No problem对不对?跑一个大家看,我也可以单独的取出其中一个字段。完全正确,完全正确好的,那这个呢,就是我们结构体的一个反序列化,好,其他的我就。比较轻松了,因为我已经有了将结构将这个字符串反序列化成结构体的这个呃讲解,那么下面的把它反虚化成麦谱和切片就如法炮制了,来吧,我们再演示一下其他的演示。也是将节省字符串反序列化成map。来吧,我们写一个函数function。好,我复制一份,那么这时呢,我们要把它反利化,反虚化成map。
14:04
OK,还是老规矩,首先呢,把这个串串拿到。你首先要通过网络或者是读取文件拿到一个map。呃,Map的字串,那这个map字串我们上面是有的,我就找一个啊同学们。很简单,我就拿这个好吧。这是个map字串,能看懂吧?好,我把它处理一下,然后呢,还是老规矩,会进行一个转移,因为你是这直接写字符串的,所以说呢,这个转移符号得给,不然的话语法会出问题。来。接着往下走。走欧了。这是拿到字符串,拿到这个字符串过后呢,我们反序列化老规矩,先定义一个map。定义一个map。这个map,这个map要跟你原先那个map这个结构要一样啊,你不能瞎定义一个map,比如说你这你这帮这个map,它的这个K是字符串的,你不能写成特咯。
15:09
所以说你这个map要跟你原先这个以前定的这个map的结构保持一致。大家能理解吗?就说因为你原先序列化的时候,你序列化的时候是针对这个map序列化的,那你反序列化,那你也得针对这个map这个结构明明白吧,也是这个map这这种map的,呃,这个这个类型啊,不能乱写一个明白。好,我定定一个,比如说叫A好吧。这个类型。完事,那么这个时候麦普按理说他是希望他是需要先make一下再使用的,但是我告诉大家。如果是反虚化,我们不需要make这个A了,因为反虚化底层它会自动的make这个map空间能理解啊,你看我这直接就直接反序列化。
16:00
反虚的话了,反。反序列化。来怎么反击的话,代码我这有了。我就偷个懒。然后呢,把我的这个A。放进去。把我这个A放进去。对不对,以引用的方式传进去。好,然后这地方如果有反虚化失败,就这样反序列化后我们把值输出来。A。等于多少?好的,我把这块清下。那这个地方反斜了过后呢,我把这个A输出来。大家看反西化成功没有?大家看反修的话成功没有,OK,我调用on master map。好,我执行一下这个代码。走一个。我们可以看到,我们可以看到,当我们反虚化这个map过后呢,它的的确确成功了。那有些同学可能有点疑惑,他说老师有个问题咯,他说你看啊,这个A是一个map。
17:06
那你在原先讲过呀,你说这个map在使用之前需要先make。我确实讲过这个东西。是吧,我说了一个map在使用之前需要先make一个空间,但是为什么我在反序列化时没有make呢?我告诉大家,这个原因其实我刚才已经提过了。在反虚化时啊,注意。注意,反序列化时,反序列化map时不需要。不需要make。为什么不需要make呢?因为因为这个make的操作,操作被直接被封装到哪个呢?被封装到这个on masterer函数里面去了,也就是说,也也就是说你这个on masterer里面呢,它会自动的对这个A,它一看,它一检测,哦,是个map,怎么办呢?他利用这个类型,他利用类型断言,他知道这个A是一个map,他在这个函数内部进行了一个make操作,所以说我们在外面呢,就不需要再make了,能理解我的意思吧。
18:12
注意啊,反虚列化map不需要make,因为make操作被封装到on Mar函数量,所以这个道理大家要要搞清楚。OK,好,紧接着我们演示第三个。第三一个下一个题就是演示什么呢,将这个接串。将这个镜状反序列化成slash切片。这个能理解吧,好,现在呢,我们把这个函数拿过来用一下,我改个名字。叫Alice。能理解啊。OK,那么less怎么做呢?同样的道理,首先得有一个字符串。能理解我的意思吧,你首先得有个字符算,那么我还是老规矩,从这边粘一份过来。
19:00
这个是一个slash的结果吧。是不是比较长,我复制一下。好,我们把它处理一下。我们把它处理一下。用双引号引起来,这边有个引号,这边也有一个引号。好,然后呢,这里面该打这个转移符,就一个一个的给一个啊,我再说一遍啊,如果你将来是通过程序读取到的,这读取到的这个反序列化的字串,是不需要像老师这样一个一个加转移符的,因为我这是直接写的字串,所以说我必须写转移符,如果你是程序读渠道的,是并不需要这样做转移的啊,再说一遍。好,走一个。OK,不要少了,同学们,在做测试的时候,咱千万不要少了这个转移符。往下再走。再走。OK。再走。夏威夷。好,这边。
20:00
Age。好,大家可以看到我这个字符串变得越来越长,那怎么办呢?大家想一想,如果这样的话,肯定不利于我们的阅读,对不对?不利于我们的阅读怎么办好办。告诉大家,当一个字符串很长的时候,我们可以把它换行来写,换行写怎么换行呢?这样子。给他演示一个,比如说我们把第一个人写完了,我们就换一行。那换一行,这样子肯定是要报错的,对吧,怎么办,简单。用这个引号给它结了,再用个加号。加号就是字符上的拼接嘛,当然你不要忘了这边也有一个好,这样就可以。看懂了没有,就说把上面这个字符串加上下面这个字符字符串进行一个拼接就OK了。那现在呢?有了它过后,我们仍然进行一个反序列化。来,这个时候我们仍然要定义一个切片。因为你要把它反虚的化成切片,你首先得有得有一个空切片对不对。
21:02
定义一个欺骗。我们这个切片的类型也不能乱写。我们这个切片的类型也不能乱写,因为你原先在序列化,序列化的时候,你的切片的类型是这个类型是这个吧,那你。那你不能说到时间我把它反序列化过后,我变成另外一种类型的切片,那就不行。明白我的意思吧,所以说你要严格的保证这个类型的一致。那你肯定是要跟双方都要沟通的,比如说我这个序列化过后,我原先这个这个数组或者这个结构体或者切片是什么样子,那你这边呢,这个B客户端也得按照这种方式进行反序列化,你不能说我序列化了一个就是你想把它转成什么类型就转成什么类型,那是不可以的。啊,那是不可以的啊,注意听这句话好,所以说呢,我把这个也给大家复制过来。所以你看我们这样一步一步走,大家就学的比较明白了,对吧。OK,好,我把它放这儿来。
22:01
好放到这儿过后呢,我们就反序列化了。反序列化。同样的道理啊,这个麦也不需要make。同样的道理,大家注意,也不需要卖迈谱了。因为这个map操作呢。这个。Map操作它也被封装到这个UN Marshal,它不管是不管是slash还是map,它直接把所有的make操作全部封装到UN Mar里面去了,所以说这个反序列话,其实还是挺简单的。好的,我把这个复制下来没问题吧,同学们看,反序列化过后,只是这里面呢,我要传的是slash。没问题,好,反序列化后,我们把这个代打印出来看一下。看效果。同学们。我们看看这一个切片的反虚的话是否成功。来运行一把。走一个,我们可以看到反序列化后完全OK。大家看slice是个切片,它里面有两个map。
23:06
一个map是这个,还有一个map是这个,没问题吧,而且这个map里面的地址呢,是一个宿主是墨西哥和夏威夷。完全OK,好,同学们,那关于我们这一个。反序列化的三种,就是讲了三种类型都说完了,那其他的这个类型的这种反序列化呢,道理是一样的。我就不一个一个的再给大家讲了,好不好,我把这个板书一下,同学们代码演示就到此了。来,走一个。好,来,走一个。我把它。给大家板述一下。直接。放一个表格啊,因为代码比较多嘛,我就直接放到一个表格里面去了,我把这里面再搂一圈啊,我们讲了哪几个。一个我们讲了反序列化结构体。没问题啊,同学们。我们又讲了一个反序列化map。
24:03
我们还讲了一个。反虚的话来。好,那么关于上面的这些代码呢,老师还有一些需要交代的地方,我再总结一下啊对。对上面代码的一个小结说明。这也很重要,注意听讲。首先我总结这么几点,大家一定要认真听啊,不然的话以后这个细节容易忽略。第一个。注意听,就是说在反序列化,在反序反序列化。一个杰森创始。制服创始。要确保,要确保反序列化。办事。列化后的这个数据类型和原来原来序列化,序列化前。
25:03
的数据类型一致。类型一致。这一点是特别重要的,就说你反序列化后的这个数据类型。要跟原来序列化前的数据类型一致,怎么个意思呢?比如说大家看到。你这个地方反序列化一个。Monster。你是这么一个。这么一个字符串,它原先是通过他原先这个字符,字符串是怎么拿到的,同学们,它是序列化一个monster结构体才拿到了一个字串,那你反虚的化的时候呢,你要把它反,也要反虚的化monster,你就不能反虚化另外一个结构体,比如说打个比方,周老师,我这有一个别的结构体叫type什么呢?The dog。也是一个结构体,注意听我的,这点很重要啊,他说我这边也有名字,我有名字,我有名字,假设它是一个in,它是一个string,那么它还有一个什么呢?它一个地址ad res好,四寸好,你不能说这样说啊,说老师我我想把这个字串反虚化成do,那这个就不可以。
26:13
那这样返修过后呢,其实是一个很奇怪的东西,因为你原先是mon,你反修的或什么dog,它字段可能就匹配不上了,明明白的意思吧。除非你这样子,也可以说,老师我能不能这样,我这虽然是个道,但是里面的字段。我这里面的字段。跟原先monster完全一样,可不可以,那可以。那可以。那是可以的,因为他这个字串里面并没有包含他到底是一个dog还是个monster。它主要是取决于你这个字段到底有哪些,你看你只要你只要保证你这个结构里面有name,有age,有birthday,有S,有这个就行了,至于你这个monster是monster还是dog,他不管。他不管,但是作为我们这个。
27:02
作为我们这个结构体来说,它真正确定它是什么类型,主要还是取决于这个字段嘛,所以说这个地方你就不能乱去。乱去,这个序列化能理解我的意思吧?好,你看我给他来把它换一个,我直接把它换成你看我直接把它换成dog,你看它也能跑起来。看到没有,为为了看到这个效果呢,我把这个牛魔王换成一个波浪号。你看啊,我现在把这个类型换成do,只是名字我没有改啊,那这是什么。哎哎,这改错了啊,改错了,改改错地方了。改错地方了,我把这个改了。Dog。然后呢,为了看到效果呢,我把牛门换成这个。对不对,也就是说这个类型变成do了,但是你这个do,你发现这个do的字段和盲字段是完全匹配的,对不对,在这种情况下你可以,那如果说你这个dog里面有个别的类型,那就麻烦了。对不对,好,我们来跑一下,看看能不能跑起来走一个。
28:02
你看。他他也没,他也没错。是吧,他也没错,这看这个是吧,也没错,所以说我在这儿提了一句话。我在这提了一句话,什么话呢?就是你要保证数据类型一致啊,数据类型一致,当然对于结构体来说,这个数据类型一致主要是指的字段。字段类型要完全一样,名字也要一样,对不对?你名字不一样,那肯定就序列不成功了。你理解这意思吧?好,这是第一个,同学们要注意的。第二个要注意一下,大家看老师在进行这个序列化的时候,你看我加了很多反引号。那有些同学老师,那以后这个序列化好麻烦呢,难道我拿到一个字符串过后,我还要把里面这个引号进行一个转移吗?不需要。如果你的这个字符串就是节省字符串是通过这个程序获取到的,是不需要加这些翻译好的。因为。因为这个字符串里面,它本身这个通过程序得到的,他这个这个引号,它自己会做这个转移处理,能理解我的意思吧,大家一定要明白啊,我给他举个例子,比如说这个字串,我用这个方式来得到。
29:14
我们前面不是有一个t map吗。我把这个test map拿过来,注意听听讲啊,注意听讲。拷贝我拿到这里来。大家看这里。这是不是一个test map,好,我让它返回一个十寸。那这我就不输出了。然后呢,我直接return。Return,然后string看懂了没有,然后呢,我这个字串。我这样获取。是轴等于。这个test map。OK,好,上面呢,我就去掉。上面我就去掉。那你看,如果我是通过一个程序或者是一个网络获取到这个字串,其实我没有必要再去加一堆这个反应号,对不对,为了看到效果,我们来加一点东西,红孩儿,我换一个波浪号。
30:11
大家看是不是,如果我是通过程序获取,这算没有必要每个都加啊,好看哪里有错误。这有个错误,看一下是哪错了。啊,这个地方,这个地方还改成monster啊。好了,朋友们,我们来看看,如果我这样进行一个处理,进行一个处理,看是不是就不需要加这些一堆所谓的反引号,对不对,好,这点也很重要,来看效果跑起来我们可以看到。选这个反虚话也是OK的,再看这里。对不对,完全没问题啊,完全没问题,好的同学们,我把这个呢也做一个总结。如果。如果字符串。如这个杰森。字符串。字符串是通过。
31:02
是通过程序。程序本身获取的。程序获取的,获取的。获取到的则不需,要则不需。不需。不需要再进行转移处理,再对这个双引号进行存,不需要对这个双引号转移处理。转移啊,转移处理。啊,因为这个转移呢,它直接就包含在这个程序内部了啊,因为转移处理,因为转移处理。处理四。是已经被已经处理啊,不争就这样写吧,就不需要对这个双引号进行转移处理就可以了啊,我这进行转移处理,那老师这进行转移处理呢,是完全因为我直接直接写了一个写了一个原生态的字串,所以说我要对它进行转移处理,能理解吧啊OK。
32:00
好,那么我把这个写到这里,大家看一下就行了。啊,比如说这个地方。对吧,你看这儿。你看这个地方,这个地方我的确做了转移处理了。因为我是原生的字串,但是如果程序其实我没有做这个转移处理,对吧,原生字串是需要这个转移处理的。这直接写。直接写这个字串是要转移的。是需要转移的。转移啊,但是呢,如果我是程序获取到的,不需要转移了。啊,通过。通过程序获取的。获取不需要不需要转移,因为它内部呢,就已经帮你转移了啊,因为内部,因为字符串内部,它的内部已经转移了。好了,那关于这块呢,我们就说到这里,把它。
33:01
板书一下。好,同学们,那讲到这呢,我给大家说一下啊,到此我们这个关于文件操作的内容呢,就给大家全部介绍完了,大家把这块东西掌握了,就在我们应用在写项目的时候,就差不多就足够用了啊啊OK,那把这块内容讲完过后呢,同学们把这个接省的序列化和反序列化,把它消化一下。消化一下,好好消化一下。我们在后面写项目的时候,还会用到序列化和反序化,比如说后面我们会写一个,呃,聊天系统就会用到这类似的知识。
我来说两句