00:00
我们接着给大家讲解一下杰森的反序列化。就接省的反序列化,那么在讲节省反序列化之前呢,我们把前面序列化的有一个地方给大家再点一下,大家看这里看我们的代码。呃,大家看到我们的代码里面呢,有一个问题啊,就这里。就是嗯,我们对这个结构体进行一个序列化的时候,进行一个序列化的时候呢,我们可以看到,当我们完成对这个结构体序列化的时候,我们可以看到它其实是把这个结构体的字段。字段的名字当做是K,把字段的值当做是值,对不对,就是当成那个value,但是呢,大家有发现,因为我们这一个字段呢,它的名字有可能不满足你的需求,比如说你看我这个N是大写的N。那有一个问题,有一个什么问题呢?大家看我们这个图,假如假如我们是一个web程序。
01:02
那这个我们我们这个购服务器把这个结构体进行序列化过后,我们传给了浏览器,那浏览器这一头呢,肯定是用像这个j query或者是加script进行一个解析。那这边呢,这个客户端,也就说我们做浏览器端呢,他往往他往往希望什么呢?他往往希望你返回来的这个这个好我们可以看到啊,稍等一下。我们再把这个看一下。这个地方。序列化test。我们看这里。这里有牛魔王对不对,我把这个保存一下。保存一下我们再看。走一下。OK,再看一下。大家看到我们这个monster序列化过后,他这个名字是大写的。他这个名name是大写的,因为这个name为什么是大写的呢?因为N就你这写的就是一个N。
02:01
对吧,但是我刚才已经讲过了,可能我们接收到这个集成串的这一端。他希望你的这一个K值都保持一个小写。或者说,或者这样说,或者说我们这个浏览器这端呢,他可能给你指定一个名字,他要求你的哪个K是一个故是一个它指定的名字,它可能更。觉得更标准一点。对吧,因为呢,因为你这个返回它是个大写的,他可能觉得不方便。不方便,那怎么办呢?大家还听说过,以前我在讲,我在讲这个。我在讲这个,呃,反虚化的时候呢,我提过这么一句,就是结构体里面有个标签叫tag。那如果说你希望你这个序列化过后的这个结构体,就是序列化过后的这个接串,它的这个K值。
03:00
它的这个K按照你指定的这个标准来这个显示的话呢,你可以给这个结构体加一个tag标签,怎么说大家看我这里来给他写一下先是。反引号,然后写接。节省。冒号,然后呢,这里面写上你的这个节省,就是节省过后,节省过后的那一个字段的名称,比如说我这里写写小写的name,比如说这个年龄,我也可以改一下,大家看到。我可以在这儿给他来一个指定,比如说Jason。然后呢,我说age好,我就写写这两个啊,我就写这两个。那如果这样写,这样写完的话呢,我们来运行一下,我们可以看到它把这个monster。他把这个monster序列化过后,我们可以看到不同的效果。我们可以看到不同的效果,OK,诶,这个写错了,不应该在这写。
04:00
写错了,不应该在这写啊,这个地方是负值的地方,咱不应该在这写,应该在结构体的定义的位置来这个指定它个标签就在这写才是对的啊。这重新写一下杰森。冒号,然后指定节省过后,在反序列化过后,这个字段的名字呢,我们叫name,而不叫这个大写的N,这个name明白。啊,当然,你甚至还可以这样写,说老师,我能不能写成monster name也可以。啊,为了以示区别,我干脆这样写一把好不好?当然,同样关于年龄,我们也可以这样写杰森。杰森。前面这个是固定的啊,前面这个你就写成杰森,然后呢,再来指定一个你希望给的名字。啊,Monster age,好,其他以此类推,我就不写了,下面这个也可以这样改。啊,那这样有什么好处呢?同学们,这样好处就是说将来我们在这个序列化过后,返回给客户端的时候,浏览器它可以用他这个喜欢的这种方式,就是他觉得K呢,都应该是小写的方式来进行这个反序列化进行操作,能理解。
05:13
好,我把这个保存一下。保存一下,那保存完了过后呢,我们再来进行一个序列化操作,我们可以看到monster序列化过后,它的这个K就是对应的命名字,这个K呢,就变成它了,来走一个。跑一把,我们可以看到。我们可以看到,当我们序列化过后,朋友们大家看这里。他的K就变成这个了。对吧,如果你没有指定,如果你没有指定这个嗯十抓呃结构体的这个帕标签,那它还保持原先的这个这个标签的名字,看到没有,那这样的话呢,我们客户端或者说另外一方,他拿到这个串过后,他可以根据他喜欢这种方式,习惯的方式进行一个反序列化。明白啊好,这个呢,我就说一下,那他这怎么实现这个机制的呢?就它怎么来实现在进行序列化的时候,把这个K由这个name改成这个monster name呢,告诉大家它用的是反射机制。
06:13
反射机制,关于这个反射呢,后面我们有一个专门的章节来讲解,这块我就先不讲了啊,后面再讲反射机制的时候,我详细给大家说一下它是怎么实现了这种转换的,好吧,好,这个呢,我给大家提一下这个做一个补充知识,给给大家提一下,OK。好,那我把这个呢,也给大家板书到笔记里面去,这有一个注意事项。这有一个注意事项啊,注意注意事项。什么注意事项呢?给大家板述一下。要如果对于。对于这个结构体的序列化。序列化,如果我们希望希望序列化后,序列化后的这个K。
07:05
K的这个名字,名字由由我们自己重新指定。重新指定。指定啊指定。那么那么可以使用这个可以。那么可以。可以给这个structure指定一个标签,指定一个tag标签即可。那具体来说呢,就是这样子的。就是这样子的。啊,这样子就可以了。如果我们这样子指定的话啊,大家可以看到,大家可以看到,你看这样指定,这样指定,指定完了后,当你序列化过后呢,它的结果就这样子的。序列化后。序列化后,它对应的这个串串呢,就这个串。大家看到没有?是这个串串对不对。看到没有,是不是这个,诶,呃,我就我就这样子啊。
08:03
我把它放到一行一行去,大家可以看到这里面的这个串呢,Mon就塌了。那有些同学可能会问了,说老师,你这不是呃,多此一举吗?有些同学可能会这样想,有些同学老师你这个感觉怪怪的,你既然想让它变成master name,那你干脆这样写不就完了吗?我给他注销一下啊,我知道有些同学可能会有这种想法。他可能有这种想法,什么想法呢?他是这样想的,我说到这呢,肯定同学有这么想,他说老师你干,你既然想用这个这个名字,那你干脆也不用去写这个所所谓的什么tag标签了,你干脆就这样写不就完了吗?你直接把这一个。把它这个字段名叫做monster name不就完了吗?何必还要多此一举呢?同学们想一想,我这样做能行吗?同学们想想,我这样做能行吗?能不能行呢?
09:00
显然,我这样做肯定是要失败的。为什么说这样会失败,大家看,因为你在进行序列化的时候,你看你进行这个结构体序列化的时候,其实你用的是Mar。你把它传进去了对不对?那么森是另外一个包,大家知不知道杰森是另外一个包,它它是另外一个包里面的一个函数来完成这个序列化的,那也就意味着在我们这个master这个函数里边,它会去使用到你的这个字段,它会去读取这个字段进行这个反序列化,对不对?但是因为你这个字段又是小写的M,大家想一想,你在这个master里面跨包的一个函数去使用一个。小首字母小写的字段能行吗?因为你字母小写的话,它其实是一个私有的,也就是说它是不可导出的一个字段,那你这样用的话,他一定会在这个序列化的时候报错,这样肯定会有问题。这晚肯定会报错,你信不信?所以说你没有办法直接在这写一个首字母小写的字段,因为你要挎包去用它嘛。
10:06
那你这个字段必须首字母大写,你才能在别的包里面去用,是不是,所以说如果我这样写的话,我们来试一下,肯定会报错的,来走一个。我们可以看到已经报错了。大家看这里。再看这里。啊,这个是七二十七行啊。27行是哪一行?哦,对,这这个地方还要改一下。我干脆既然我已经改了,我我就让他看到啊。他肯定这儿不会报错了吧。因为你既然这写的是master name,那这边肯定也是master name,但是我告诉大家,你这样改了过,这还是要报错。原因还是一样的,因为你跨包去使用一个不可导出的字段,那肯定报错,那再来跑一下。我们看效果。大家可以看到。大家可以看到。序列化过后。我们可以看啊来,大家有没有发现。
11:00
他确实是没有报错了,但是你你发现有个什么问题。Monster虚拟化过后。年龄。Birthday。Salary。Scale有了,但是你们有没有发现有一个字段丢掉了?有一个字段丢掉了。哪一个字段是不是就是这个字段没有了呀,Master name就没有了,他虽然这没有报错,他虽然没有报错,他肯定是在他这个master这个函数里面做了一个判断,如果说可导出我就去处理,如果不可导出,我就不处理了。那你那你不管怎么样,你你丢掉了一个字段信息啊,那相当于就是错了吗。你看原先这个monster里面有五个,有五个字段,年龄、生日、薪水和他的scale,但是等到你序列化过后,你会发现你丢掉了一个字段。只有一个年龄,Birthday salary和skill丢掉一个字段,那相当于是错了,对不对,只是说他这没有报异常而已,那想大家可以去看源代码,他这个源代码里面,他肯定做了一个判断,就说这个字段能不能用。
12:09
如果他不可用的话,它直接就不去处理这个字段,那显然这个并不是我们程序员想要的效果,能理解我的意思吧,所以说为什么我要把它写成这样的形式,能理解了吗?因为我要兼顾这个Mar。这个序列化函数能够使用到或者访问到这个字段,同时我还希望什么呢?我还希望他序列化过后,这个字段的名字按照我我指定的这个名字来处理,明白这个意思吧,好,我把它再再改回去啊,再改回去过后,当然这个地方呢,在这个购程序里面,我们还是要用name。对吧,好,我们再来看一把,彤彤,同学们再来看一把,这个又恢复正常了。这个又恢复正常,大家看是不是这样的道理。你看你这是不是又多了一个。Monster name就monster name就过来了,Monster age也过来了,对不对,好了同学们,那关于这一个关于在序列化的时候,这个是说呃这个结构体标签的,呃tag标签的是这个问题呢,给大家做了一个介绍。
13:13
那有些同学可能会问说老师他是怎么实现的,他是怎么在这个on Mar Mar里面去把他在Mar的时候,他用的是他怎么找到这个monster name name字段去替换这个name字段的名称呢?告诉大家是用反射机制,我先点到这里,后面呢,我们再讲反射机制的时候,再详细给大家做一个介绍,OK,好,那关于这个序列化的一个补充知识,或者叫做或者叫做一个补充说明,我们就先给大家介绍到这这里大家领会一下。
我来说两句