FastJson 原理
2019独角兽企业重金招聘Python工程师标准>>>
1 序列化:通过asm 获取对象上的属性的get方法集合,然后通过调用相应的方法拼装出json字符串。
2 反序列化:通过asm 获取对象上的属性的set方法集合,然后调用set方法集合,赋值到相应的属性。
所有的parser基本上都需要做词法处理,json也不例外。fastjson词法处理的时候,使用了基于预测的优化算法。比如key之后,最大的可能是冒号":",value之后,可能是有两个,逗号","或者右括号"}"。
3 封装了ASM,直接操作java类文件,获取要序列化和反序列化的类的属性方法,get set 等。
4 实现了一个类似StringBuffer的可以append的对字符串操作的类。实现了Appendable接口。
SerializeWriter功能和StringBuffer类似。里面增加了ThreadLocal变量来存储char[]buf 数组,减少对内存的分配与回收。
提供一些针对性的方法减少数组越界检查。
5 IdentityHashMap 个人感觉这个map实现仅仅是针对fastJson场景用来存储类(.class,加载时就分配规定的内存地址)。所以该类不适合做其他用处。
public class IdentityHashMap<K, V> {public static final int DEFAULT_TABLE_SIZE = 1024;private final Entry<K, V>[] buckets;private final int indexMask;public IdentityHashMap(){this(DEFAULT_TABLE_SIZE);}public IdentityHashMap(int tableSize){this.indexMask = tableSize - 1;this.buckets = new Entry[tableSize];}//要求必须用同一个内存分配的对象去取才可以,不然buckets定位不到,或者 == 判断通过重新分配的值相同的String // 会有问题。public final V get(K key) {final int hash = System.identityHashCode(key);final int bucket = hash & indexMask;for (Entry<K, V> entry = buckets[bucket]; entry != null; entry = entry.next) {if (key == entry.key) {return (V) entry.value;}}return null;}public boolean put(K key, V value) {final int hash = System.identityHashCode(key);final int bucket = hash & indexMask;for (Entry<K, V> entry = buckets[bucket]; entry != null; entry = entry.next) {if (key == entry.key) {entry.value = value;return true;}}Entry<K, V> entry = new Entry<K, V>(key, value, hash, buckets[bucket]);buckets[bucket] = entry; return false;}public int size() {int size = 0;for (int i = 0; i < buckets.length; ++i) {for (Entry<K, V> entry = buckets[i]; entry != null; entry = entry.next) {size++;}}return size;}protected static final class Entry<K, V> {public final int hashCode;public final K key;public V value;public final Entry<K, V> next;public Entry(K key, V value, int hash, Entry<K, V> next){this.key = key;this.value = value;this.next = next;this.hashCode = hash;}}}
转载于:https://my.oschina.net/robinyao/blog/477394
FastJson 原理相关推荐
- fastjson反序列化漏洞原理及利用
重要漏洞利用poc及版本 我是从github上的参考中直接copy的exp,这个类就是要注入的类 import java.lang.Runtime; import java.lang.Process; ...
- fastjson序列化原理详解
2019独角兽企业重金招聘Python工程师标准>>> 所有序列化的API都在JSON类中,方法名称为toJSONString,或者我们也可以设计自己的序列化方法,代码如下: pub ...
- python 获取用户ip_Python爬虫教程:你还在苦苦拉票吗?刷票小程序案例原理剖析!...
你还在苦苦拉票吗? 前言 剖析投票原理 处理思路 具体实战 主要流程 具体细节python 代码实例python 具体细节java 代码实现java 总结 点击此处,获取海量Python学习资料! 前 ...
- 42. fastjson处理下划线和驼峰问题的方法和源码分析
一. 前言 在开发过程中经常遇到json解析和生成的问题,所以用自己也一直用fastjson来实现这个功能. 但是,最近遇到一个问题: json字符串里面的数据很多都是"_"下划线 ...
- 网络编程 -- RPC实现原理 -- RPC -- 迭代版本V3 -- 远程方法调用 整合 Spring
网络编程 -- RPC实现原理 -- 目录 啦啦啦 V3--RPC -- 远程方法调用 及 null的传输 + Spring 服务提供商: 1. 配置 rpc03_server.xml 注入 服务提供 ...
- fastjson到底做错了什么?为什么会被频繁爆出漏洞?
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 fastjson大家一定都不陌生,这是阿里巴巴的开源一个JSON解 ...
- 配置中心Apollo的设计原理
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:https://urlify.cn/eIBZne 前言 Ap ...
- 实现扫码登陆的最简单方案与原理
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:http://t.cn/Eogt0kw 需求介绍 原理解释 ...
- 面试官:你能说说MyBatis拦截器原理吗?
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者:Format cnblogs.com/fangjian042 ...
最新文章
- 资源 | 100+个自然语言处理数据集大放送,再不愁找不到数据!
- 轻量级UML工具-UMLet
- ListView加checkBox可以实现全选等功能
- 题目1549:货币问题
- Java+Selenium Web UI自动化测试的一些总结
- 【USACO 2.1】The Castle
- linux不显示无线网卡驱动安装失败,Linux_Ubuntu无线网卡驱动安装方法,安装了Ubuntu后发现没有无线网 - phpStudy...
- Source Map调试压缩后代码
- java socket 实现 http_Java Socket编程 - 基于Socket实现HTTP下载客户端
- C++基础教程之数组
- 有的时候print函数不会立即打印的解决办法(flush=True)
- 在校大学生如何规划自己的程序员之路
- fedora mysql添加密码_Fedora14下 mysql更改密码
- axure 7.0 注册码
- JDK自带的命令行工具
- python量化投资系统构建_零基础搭建量化投资系统 以Python为工具
- 02-2017.07-计算机设计大赛《盲人的眼睛》
- 世界坐标系(WCS)和用户坐标系UCS
- Pycharm 许可证过期解决
- 01 Java体系