java的序列化和反序列化Serializable原理
背景实现Serializable接口就能把对象序列化反序列化出去,那么原理是什么呢?带着以下问题一探究竟
为什么实现这个接口就能序列化和反序列化呢?
序列化和反序列化的内容是什么呢,可以自定义吗?
为什么实现这个接口就能序列化和反序列化呢
java序列化代码 123456789public static void main(String[] args) throws IOException { Object o = new Serializable() { String strValue = "这是内容"; Integer intValue = 999; }; File file = new File(System.getProperty("java.io.tmpdir"), "serializable/"); ObjectOutputStream objectOutputStream = new ObjectOutputStream( ...
mybatisPlus分析Lambda语法原理
用lambda就不用写字符串了,这个对于开发业务来说,能减少很多的错误发生。尤其是字段写错了,数据库变更字段名了,等。用法如下
1eq(FissionCoupon::getMid, mid)
他会自动转换为mid,那他的原理是什么呢?原来他接受的是一个可序列化的Function对象
123@FunctionalInterfacepublic interface SFunction<T, R> extends Function<T, R>, Serializable {}
其实用到了jdk自带的序列化。因为lambda是个特殊的实例,也是个特殊的class。在序列化的时候lambda实例中有一个writeReplace方法。
可参考jdk的序列化 Serializable原理该方法的返回值是一个lambda描述对象,java.lang.invoke.SerializedLambda 1234567891011121314public final class SerializedLambda implements Serializabl ...
枚举序列化和反序列化的代码
在java或各种框架中,[反]序列化对枚举类型默认一般都是用的枚举的名称。如果代码有魔法值,我们想改成枚举类型。但我们在改造、重构后端的时候不想对前端或者第三方有影响,可以用到此方法。
必须用到的枚举工具类
参考通用枚举 通用枚举所有的枚举想要实现(反)序列化比较要用到通用枚举,实现通用枚举的接口即可
代码(最初版本)1.可反序列化的枚举
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768/** * 可反序列化的枚举 */public enum DeserializableEnum { // DBEnum是MybatisPlus枚举的adapter,增加了getDoc的方法。MybatisPlus是直接支持数据库[反]序列化的。但是还不支持和前端的[反]序列化的交互,所以在此配置即可。 DB_Enum(DBEnum.class, DBEnum::getVal ...
mvc枚举序列化和反序列化的配置
必须用到的枚举工具类
参考通用枚举 通用枚举
使用背景spring mvc 接收或者序列化枚举类型时,
默认是根据枚举的名称(string)进行序列化或者反序列化。但是在实际开发当中,我们一般用枚举代表某一个数值,数据库存储值。
同时我们也希望和前端交互用数值交互,而不是string名称。因此用到这个工具类支持以下几个组件的反序列化和序列化
spring convert@RequestParam@PathVariable...
jackson@ResponseBody
fastjsonJSON.parseObject(...)
代码
枚举序列化和反序列化的代码 枚举序列化和反序列化的代码
使用方式springConverter组件的使用spring 接收参数为form表单请求时,默认用的converter组件进行转换对象
12345678@Configurationpublic class AddEnumConverter implements WebMvcConfigurer { @Override public void addFormatters(For ...
业务开发如何优雅的编写代码
背景我们开发人员,基本都是从搬砖的码农做起,但也有非常优秀的人,一直在做中间件或其他底层通用的逻辑。显然,我们大多数都不够优秀。
那针对业务开发的我们也需要提升自己的技能,而不是每天的CURD,为了提升我们自己,所以在我们的日常开发工作中不仅仅完成任务作为目标,至少还有一些目标之外的思维,如
代码阅读性高吗?
代码便于维护或协作吗?
代码会不会冗余?
怎样用更精简的方法实现它呢?
自己有没有重复造轮子呢?
...
如果缺少了这些思维的话,那你适合做管理层。本文是个总结文,就拿我常在开发中用到的技术展开交流。需要读者点开其他文章依次观看😂
springboot + mvc + mybatisPlus + dubbo + Saas业务
定义通用枚举
通用枚举避免魔法值、统一枚举的获取方式
springMvc枚举(反)序列化配置定义好通用枚举之后也要配置好(反)序列化,mybatisPlus也支持枚举,结合起来。项目当中能够完全避免魔法值的产生
定义一个获取当前环境的枚举的工具类这个很有必要,在复杂业务的情况下,不同业务,不同环境下逻辑也不一样。比如说swagger不能在线 ...
奇葩说-刘秦vs薛兆丰
总感觉我一个文盲谈论一个权威极高的教授实在是没有资格。但也确实这样(没有资格)。但我观察这两个教授的言行并总结下来能够对我有很大帮助
第7季宋丹丹来的那一季因为我只看了20分钟,印象不深,但是薛老师的观点我特别赞同,所以印象特别深
薛兆丰
痛苦不是成本,损失一个机会才是成本
痛苦是可以磨炼人的意志力的。对你来说并没有损失什么,只是心情上的落差。
但是在现有的社会中没有人会关心你的心情,人毕竟是自私自利的。所以在三观正常、态度正确的情况下你应该为你争取更多的机会。而不是胆怯和懦弱
做难做的工作,谈简单的恋爱
人是琢磨不透的,月有阴晴圆缺,人有阴晴不定,如果你谈难谈的恋爱,很有可能结果是一场空。
但是你做难做的工作,对你来说都是阅历、知识和经验、对以后事业是有帮助的(毕竟人还是要独立的)。
虽然你谈复杂的恋爱也有经历和经验,也能傍大款,但是一但你换对象(换工作)会给人的感觉你不忠,能天天傍大款吗?再说傍大款也需要你有内在的谈吐(就是你肚子里有没有墨水)。
更何况不忠映射到工作上来呢(Boss会录用一个不忠的人吗)?所以一定要做做难做的工作,谈简单的恋爱
js-copy
觉得手动copy麻烦的话,写一个小脚本,执行即可copy
123456789101112// 获取vallet val = "";// 这段代码是我们在confluence 维护的sql代码片段。执行即可获取全部的sql$('.code .container div').each((i,e)=>val+= $(e).text() + "\n");// 执行copylet input = document.createElement('textarea');input.value = val;document.body.appendChild(input);input.select();document.execCommand('copy');document.body.removeChild(input);
我的第一本人生规划手册
我的第一本人生规划手册
小孩子为什么会情绪崩溃大哭?因为当脑子中的词汇量无法精准表达自己情绪的时候,只能情绪大哭。
我理解一旦有失落的时候,情绪不好的时候,一定要找人倾诉,表达出来。其实就是释放出来,但不一定倾听者是人。主要就是不能憋着。
5w2h1e
why、what、who、when、where为什么要干什么,谁,何时何地
how、how much怎么做,需要多少资源?
effect预测结果,有什么样的效果?
通用枚举
使用场景我们一般用枚举来代表数字或者字符串,避免魔法值的产生。
有时需要根据数字或字符串获取到对应的枚举。
虽然可以在枚举里面写静态方法根据int获取对应的枚举也可以做到,但是你需要在一个枚举写一个方法,如果有N多个枚举则会非常的冗余类似于这段代码
123456789101112131415161718192021222324@Getterpublic enum Condition { ONCE(0, "满"), EACH_TIMES(1, "每满"), LADDERED(2, "阶梯满"); private final int code; private final String name; Condition(int code, String name) { this.code = code; this.name = name; } // 类似于这段代码 public static Condition getTypeByCode(int code) { ...
javaUtil动态代理
动态代理有很多使用的场景,比如
springAOP切入
spring事务、缓存
自定义业务场景等
本文就是一个动态代理util。为了使用起来更加的方便。之后的文章也有可能用得到。
后续用新文章来分析动态代理的原理
本文的使用场景(点我)
代码123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110import org.springframework.beans.BeanUtils;import org.springframework.cglib.proxy.Enhancer;import org.springframework.cglib.proxy.MethodInterceptor;i ...