在开源项目中看到一个判断对象 序列化类型方法,现在它是你的了。

2023年 8月 13日 43.7k 0

标题照着why哥 copy一份,哈哈,希望大佬来点好运气

image.png

你好呀,我是雨夜。

在 fury 的官网中看到一个 ‘判断是不是jdk序列化’ 的方法。

image.png

看明白之后,我觉得还是有点意思的,结合自己的理解和代码,加上画几张图,给你拆解一下 fury 里面的“判断序列化类型”。

虽然是在 fury 里面看到的,但是本篇文章的内容和 fury 框架没有太多关系,反而和基础知识有关。

所以,即使你不了解 fury 框架,也不影响你阅读。

当你理解了这个类的工作原理之后,你完全可以把这个只有 10 多行的类搬运到你的项目里面,然后就变成你的了。

你懂我意思吧。

jdk 序列化

怎么判断的

image.png

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 还能想起什么?

停个几秒 想下

image.png

常用的BIOS中断有这些:

1、向屏幕输出:int 0x10

2、读写软盘:int 0x13

3、系统调用:int 0x80

image.png

性能比较

我第一次测试的结果

问了下大佬

f54bd6d55bb958fd2be4bdb6b05bb2d.png

但是后面具体看的时候,发现不是这块的事

这块我用的是 arthas

结果你告诉我这

image.png

执行过一次 方法之后 就可以了,因为里面用了 JIT 生成了一些类

image.png

fury 序列化消耗的时间 353
jdk 序列化消耗的时间 69
fury 序列化消耗的时间 3
jdk 序列化消耗的时间 23
fury 序列化消耗的时间 5
jdk 序列化消耗的时间 22

这个时候 已经卡住了,要想别的办法 确定是哪部分耗时了

我就把源码下载下来,直接添加了一个java agent 直接打印每一行的耗时

确定

byte[] bytes = fury.serialize(object);

耗时比较多,它第一次执行消耗了100ms

public Class

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论