序
标题照着why哥 copy一份,哈哈,希望大佬来点好运气
你好呀,我是雨夜。
在 fury 的官网中看到一个 ‘判断是不是jdk序列化’ 的方法。
看明白之后,我觉得还是有点意思的,结合自己的理解和代码,加上画几张图,给你拆解一下 fury 里面的“判断序列化类型”。
虽然是在 fury 里面看到的,但是本篇文章的内容和 fury 框架没有太多关系,反而和基础知识有关。
所以,即使你不了解 fury 框架,也不影响你阅读。
当你理解了这个类的工作原理之后,你完全可以把这个只有 10 多行的类搬运到你的项目里面,然后就变成你的了。
你懂我意思吧。
jdk 序列化
怎么判断的
public static short getShortB(byte[] b, int off) {
return (short) ((b[off + 1] & 0xFF) + (b[off] >> 8);
}
所以我们取 b[1]就是 0xaced
0xaced是序列化的头信息字段。在Java的序列化机制中,当一个对象被序列化时,会先写入一个表示序列化信息的头,其中包含了魔术数字(magic number)和版本号。0xaced就是表示序列化的魔术数字,它表示序列化的格式和版本号。
停一下 ,你看到0xaced 还能想起什么?
停个几秒 想下
常用的BIOS中断有这些:
1、向屏幕输出:int 0x10
2、读写软盘:int 0x13
3、系统调用:int 0x80
性能比较
我第一次测试的结果
问了下大佬
但是后面具体看的时候,发现不是这块的事
这块我用的是 arthas
结果你告诉我这
执行过一次 方法之后 就可以了,因为里面用了 JIT 生成了一些类
fury 序列化消耗的时间 353
jdk 序列化消耗的时间 69
fury 序列化消耗的时间 3
jdk 序列化消耗的时间 23
fury 序列化消耗的时间 5
jdk 序列化消耗的时间 22
这个时候 已经卡住了,要想别的办法 确定是哪部分耗时了
我就把源码下载下来,直接添加了一个java agent 直接打印每一行的耗时
确定
byte[] bytes = fury.serialize(object);
耗时比较多,它第一次执行消耗了100ms
public Class