00:01
好,接下来呢,我们看一下在咱们这个上午的测试当中呢,咱们创建了一个测试用例,然后这测试用例当中呢,咱们去啊注入了一个resource,又注入了一个resource,这个用resource注入了一个red templ,又用resource呢注入了一个map,对不对,然后在咱们这个测试方法当中呢,咱们首先用map选出了一条记录,然后呢,又用red template将这条记录呢,以序列化的方式啊存入到了我们的red服务器当中,并且呢,过期时间呢,是啊,这个五分钟啊,然后呢,存的方式呢,主要就是字符串的方式去存啊好,那这块是我们的第一个测试,那接下来呢,我们再把上午的这这个测试呢再走一遍。
01:00
好,然后。然后接下来呢,我们来看一下这面哈。啊,这面。刷新一下,好,这个就是我们上午说的问题,什么问题呢?就是它的这个键呀,和值呀,都是JDK序列化的方案,那我们呢,要给它改造成Jason序列化,所以怎么改造呢?第一个步骤我们要创建一个red的配置文件,好,那接下来呢,我们来创建red配置文件。在。我们的car这个里面,在config这个里面。我们创建配置文件,当然了,如果你说我的这个red呢,未来在其他的微服务当中也要用。啊,那我们就创建在base里面啊,因为确实是这样的,我们这个red呢,未来在其他的微服不单单是service call当中用,在其他微服务当中也要用,那我们呢,就把配置文件往上移啊,移到它的base这里读一下,那么我们在这个con里面啊,去创建一个配置文件,这个配置文件呢,我们管它叫red con好,然后呢,在上面这块我们写一个注解叫configuration好,接下来呢,这面呢,我们去写它的这个BB这块的这个配置呢,啊,不用大家去对着写下来啊,因为这个代码都已经给大家了,未来我们去在写这个配置文件的时候呢,也都是这样的一些套路啊,我先把它复制过来,然后把重要的代码呢,先给大家说一下啊,后面这块呢,我们就先暂时。
02:40
我先给他。屏蔽一下啊,也就是说这三行代码是最基本的一个代码了,那这这三行代码是什么呢?首先我们要的是red time对不对啊,然后我们这边不是就是啊注入一个red templ嘛,但是这个redl呢,它是一个默认的啊,我们需要呢,对它进行一个优化处理。
03:02
第一个优化呢,就是我们加red connection factor,那这个red connection factor呢,是需要我们设置到这个red里面的,作为这个red template的一个连接池工厂,什么叫连接池工厂呢?就是我们想让我们的这个red template呀,使用这个lecture连接池工厂,这样的话呢,能够提高red啊连接,就是提高这个red template连接red数据库的效率啊,那这个连接池呢,和我们之前学的数据库连接池是一样的啊,就是先这个初始化一大堆这个数据库连接对象,然后放在池子里对不对,好,这是一个道理啊,所以这块呢,我们是使用了连接池对象,然后这块呢,就是首先对red temp的一个优化哈,是设置连接池工厂。好,然后接下来呢,我们来看一下,呃,第二个我们要做的这个优化就是关于序列化的优化了。
04:11
这个地方。这个地方呢,你看我们创建了一个string redize啊,默认情况下呢,Red的这个键值啊,用的是JDK的red系ize,所以呢,我们要替换它原本的那个默认的JDK序化方案,我们呢用字符串red序列化方案啊,直接创建这么一个string redize,然后呢,Red template有一个方法叫做set key key呢就是建的意思,Set兼职的序列化方案,然后呢,我们把刚才这个string red s给它配置上就可以了,所以呢,这句话写完了之后呢,它会帮助我们做什么呢?就会帮助我们把这个键完成一个字符串的序列化的形式,所以呢,我们来看一下啊先嗯,行,再运行一下吧。
05:05
这地方运行一下。好,这面呢,我们就又执行完了,执行完了之后呢,我们来看一下这面,大家看这回呢,我们的这个键,也就是key的序列化方案,我们就给它进行了一个优化,不再是这样比较不好读的K了,而是这种一眼就可以看出来是什么K的K是不是其实就是字符串原样输出,不要给它加一些啊JDK序列化的前缀啊好,那这个呢是对。我们的啊T啊做一个序列化,然后接下来呢,我们再来对Y6,也就是说这面的Y6再做一个序列化,那我们还是用呃,这个Jason的序列化方式啊,那现在目前为止呢,它把对象以这个字符串的形式存的呢,是用这种这种东西我们看不明白的东西存在,那我们希望呢,把它变成Jason字符串,诶这个怎么做呢?就是这个。
06:21
下面这个哈。叫做Jackson to Jason啊,然后red civilizer,好,然后呢,我们拗一个把这个对象溜出来啊,溜出来之后呢,里面呢,就是可以接收任何类型的数据,然后把它做一个折线序的话,好,然后这个写完了之后呢,我们再复制一行,再复制一行呢,就是这一行啊。把这一行先复制过来,好,大家看这个地方我们创建了一个啊对象的一个Jason序优化器,然后接下来呢,在这个地方啊,和上面这个差不多,只不过上面这个呢是set keyizer,这个呢是set valueizer,我们呢就把这个Jason序列化器呢,设置给这个三方法,这样的话呢,我们再序列化出来的这个结果长什么样呢?我们来看一下。
07:17
这面我们右键运行。好,这边呢,我们就执行完了,执行完了之后呢,我们再来看这面数据,这个这个数据证明啊,好相当于前面的那个已经过期了啊,然后这个呢,又被我们新存的这个覆盖掉了,大家看这回呢,就是Jason徐刘海方案了,看没看着啊,就是完全是Jason数据啊,我们把这个Jason数据呢,粘到一个Jason的一个显示的一个工具当中哈。
08:07
好,我把这个粘过来啊。然后大家看这个,就是它展示的这么一个,这son数据,这Jason数据长这样,就ID parent ID name value,这code是吧,都是以这建筑队的形式存在的,然后后面delete it,还有has children啊,都是正常的Jason,好有一个不一样的呢,就是针对这个create time和update time的处理啊,因为这个create time和update time呢,在我们数据库中的数据类型是啥呢?是这个。好,是这数据类型叫呃,上午的时候我提到过一下,是不是是local data time,而不是什么呀,Date啊,这个是JAVA8当中已经推荐你放弃的了,弃用的了,而这个呢,是JAVA8当中推荐的数据类型,所以一般情况下呢,我们会都都用这个啊好,然后呢,接下来呢,因为它是呃这个做字符串格式化的时候,做日期格式化的时候,它是线程安全的啊,然后接下来呢,我们呢,就。
09:15
在Jason序列化的时候,针对于这种数据类型呢,它的这个序列化的结果呢,是长这个样子的啊,他就又把呃,其中的什么年月日啊,十分秒啊,又作为pre time的属性单独就给它列出来了啊,这个也是一样,单独就列出来了,这块这样列倒是挺好的,也就是说它这个信息非常丰富啊,把所有的这个时间日期格式呢都展示出来了,但是这种有什么问题啊,就是到时候咱们反序列化的时候会反不返不回来啊,因为咱们这个Jason的反序列化呢,它实际上它这个c time呢,就是和我们之前那个时间日期一样,就是在。嗯,这个啊,你比如说这种时间类型,我序列化的时候呢,我可能会生成这样的一个值,就是这是键对吧,然后这是值,值可能是2020年的1月1日,然后是01:01:01 01:01:01啊好,那这个是他正常应该序列化出来的这么一个结果啊,然后反序列化的时候呢,再直接根据这个结果再给它塞回到这个属性当中就可以了,但是这个local data time,它在序列化的时候呢,序列化的不是一个字符串,而是一个对象,甚至对象里面还套对象,这种呢,我们以现有的这种反序列化工具呢,没有办法把这个东西在反序列化回Java的对象当中,这个大家可以理解吧,所以呢,我们就不能用这种序列化方案,或者说我们要对这种序列化方案进行改造,改造成什么样的呢?就是把这个create time呢给它。
10:56
序列化成一个时间日期字符串的形式,而不是一个对象的形式,否则会影响它的反序列化。好,那么我们在这个地方。
11:09
哎,那个后端啊,我们在这个地方,呃,就这面啊,我们在这个地方就需要干嘛呀,就需要对这个时间日期的序列化呢,做一个进一步的改造啊,做一个进一步的改造,怎么改造呢?我们这样去写。啊,有一个叫做的啊,专门处理类映射的这么一个类。然后这个类映射这个类呢。它有一个呃方法叫disabled这个方法。就是这个有一个方法叫disable的,他呢,可以去把当前的这个,呃,就是我们看到的这种时间日期类型的这种序列方,把方案呢给它禁用掉,也就是说呢,先禁用掉目前为止的这种序列化方案,然后去取而代之的是取代用一个什么样的新的序列化方案呢?用这样叫Java time model啊,这也是啊,在我们的。
12:28
这个faster Jackson这个里面给我们提供的一个工具类啊,好,那么我们就指定用这种时间日期的序列化方案来做我们的时间日期序列化,明白吧,啊,当然了,前提呢,是咱们先创建这么一个object map出来啊,首先先禁用啊它原本的序列化方案,然后呢,再使用我们先指定的这种序列化方案,好,那这个写完了之后怎么样去应用上呢?把这个东西这个这个sir Jackson啊呃,Red civilizer,它有一个方法。
13:04
叫做set object map,然后我们呢,就把这个object map设置给它就行了,这样的话呢,你看原来我们这个Y6的序列化呢,就直接是他,他完了之后呢,直接就设置给他就行了,是不是就设置我们的Y序列化方案,但是针对这个Y6的序列化方案呢,我们要再给它建立一个特殊的配置对象,这个配置对象呢,我们最后再设置回来,意思呢,就是这个配置对象里面设置的一些个性化的序列方,序列化方案我们呢,给它应用到这个里面啊,所以这是个性化序列化方案的一个使用,然后接下来呢,我们再来运行一下这个代码。
14:08
好,这样的话呢,这个咱们就写好了啊,写好了之后呢,啊,这个运行好了之后呢,咱们这边呢,再执行一下啊还是它,然后大家看这回呢,这是最新啊又产生的一个序列化的这么一个程序,好,然后我们把这个程序的结果呢复制过来。大家看明显比刚才短了很多哈,然后你看这回时间和日期就是我们希望的字符串形式的了,所以刚才那段代码呢,实际上就是对这个时间和日期的这个序列化做了一个改造,这样的话呢,回头咱们再反序列化,什么叫反序列化,就是把值从red中间取出来存到Java对象里的时候呢,它能够进行一个相对应的一个转换啊,否则的话就没有办法去做这样的一个转换,所以大家看现在呢,它的这个序列化的结果呢,就长这个样子的啊,长这个样子,那这样的话呢,就是一个大括号里面呢,有所有的值对应在这个地方,但是这种序列化的方案呢,还是不行,为什么?
15:08
如果大家记得刚才我们的那个JDK序列化的时候,知道JDK序列化里面有一个非常重要的节点。我把这个configuration给它屏蔽掉啊,把这个屏蔽掉,这个配置是不是就失效了啊,好,我们先让这个配置失效啊,再回到我们最开始的一个状态啊,然后咱们先把这个代码运行一下。好。好,那这块我们我们就写完了,写完了之后呢,我们来看一下刚才生成的这个序列化的这个这个值啊,这就是最开始那个JDK大家看啊,后面这些呢,其实都是,呃,我们数据对象的内容,但是前面有一个非常重要的部分的内容,就是他一定要把这个你的对象的类型序列化到文本字符串当中,因为你对象的类型不序列化到文本字符串当中,人家反序列化的时候,人家不知道把你这堆东西往哪个类里组装。
16:20
明白吧,所以呢,你咱们在做序列化方案的时候,最终的一个结果啊,就是一定要做,做到什么呢?就是你序列化最终的这个字符串里面一定有一部分是说明这个类是什么类型的这个对象哈,就是你序列化的这个对象,它当时是属于什么类型的,这样的话呢,我们在做反序列化的时候呢,然后Java程序呢,就会先创建这个类型的对象,然后再把这些值呢,分别去塞到这个类型的各个属性当中,所以这个才是它的一个序列化和反序列化能够成立的一个基本的前提,那大家想一想,刚才我们序列化出来的这个东西,它根本就没有类型。他没有类型的话,就意味着回头我们反序列化的时候,Java程序根本就不知道要把你这几个属性存到哪个对象里,他得先创建出来一个对象,然后再把你个属性存进去,但是他根据你给他提供的这些序列化信息,他不知道应该存到哪个对象,所以呢,我们在做序列化的时候呢,还要考虑把这个对象的类型哈,也存到序列化的结果当中,然后那我们怎么做呢?我们就在我们这个代码当中。
17:26
好,我先把这个给它放开,放开之后呢,在这个代码当中呢,有一句话呢,是啊,记住序列化类型的就这句话。我把它复制一下啊。好,这句话呢,你写在哪都行,只要写在object创建完成之后就行。这样写好,那它是什么意思呢?Active default type叫做激发激活默认类型啊,然后呢,后面这个呢,其实就是啥意思呢,就是把这个,而且这个数据类型必须是非final类型的啊好,然后接下来呢,这个意思呢,就是把当前这个实例的这个数据类型呢,也存到我们最终序列化的这个结果当中,所以呢,他对这个object map呢,做了一个设置哈。
18:20
将当前对象的数据类型点存入序列化的结果字符串中,啊,是这样一个意思哈,然后接下来呢,我们最后再测一下,在这地方还要测一下。
19:01
好,那这块呢,我就写好了啊,写好了之后呢,咱们再来看一看这个啊,Red里面所存的这个数据啊,刷新一下,那这个呢,就是我们刚刚最后序列化产生的这个结果,我们再把这个结果呢,为了更清晰,我们再拿到这边来看一下啊很明显这一回是不是上面多了一个数据类型在这啊,啊这样的话呢,我们在后面在做反序列化的时候,诶,他就知道了这些数据要存在哪里,要存在这个对象,所以反修的话的时候呢,Java程序就会自动的先根据这个数据类型创建,这不是字符串嘛,那就根据反射机制是吧,根据这个类型创建一个对象啊创建完对象之后呢,再把这里面的每一个值呢,再set到这个对象里,这样的话呢,我们的反序列化就成功了啊,我们就可以成功的从red数据库当中把我们原始的对象再拿出来做一个存储了,所以这块呢,是最终我们序列化的一个结果。那这也是我。
20:01
我们整个red配置文件的完整的内容了,所以到这为止,我们这个red配置文件呢,就配置完毕了啊。
我来说两句