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 原理相关推荐

  1. fastjson反序列化漏洞原理及利用

    重要漏洞利用poc及版本 我是从github上的参考中直接copy的exp,这个类就是要注入的类 import java.lang.Runtime; import java.lang.Process; ...

  2. fastjson序列化原理详解

    2019独角兽企业重金招聘Python工程师标准>>> 所有序列化的API都在JSON类中,方法名称为toJSONString,或者我们也可以设计自己的序列化方法,代码如下: pub ...

  3. python 获取用户ip_Python爬虫教程:你还在苦苦拉票吗?刷票小程序案例原理剖析!...

    你还在苦苦拉票吗? 前言 剖析投票原理 处理思路 具体实战 主要流程 具体细节python 代码实例python 具体细节java 代码实现java 总结 点击此处,获取海量Python学习资料! 前 ...

  4. 42. fastjson处理下划线和驼峰问题的方法和源码分析

    一. 前言 在开发过程中经常遇到json解析和生成的问题,所以用自己也一直用fastjson来实现这个功能. 但是,最近遇到一个问题: json字符串里面的数据很多都是"_"下划线 ...

  5. 网络编程 -- RPC实现原理 -- RPC -- 迭代版本V3 -- 远程方法调用 整合 Spring

    网络编程 -- RPC实现原理 -- 目录 啦啦啦 V3--RPC -- 远程方法调用 及 null的传输 + Spring 服务提供商: 1. 配置 rpc03_server.xml 注入 服务提供 ...

  6. fastjson到底做错了什么?为什么会被频繁爆出漏洞?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 fastjson大家一定都不陌生,这是阿里巴巴的开源一个JSON解 ...

  7. 配置中心Apollo的设计原理

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:https://urlify.cn/eIBZne 前言 Ap ...

  8. 实现扫码登陆的最简单方案与原理

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:http://t.cn/Eogt0kw 需求介绍 原理解释 ...

  9. 面试官:你能说说MyBatis拦截器原理吗?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者:Format cnblogs.com/fangjian042 ...

最新文章

  1. 资源 | 100+个自然语言处理数据集大放送,再不愁找不到数据!
  2. 轻量级UML工具-UMLet
  3. ListView加checkBox可以实现全选等功能
  4. 题目1549:货币问题
  5. Java+Selenium Web UI自动化测试的一些总结
  6. 【USACO 2.1】The Castle
  7. linux不显示无线网卡驱动安装失败,Linux_Ubuntu无线网卡驱动安装方法,安装了Ubuntu后发现没有无线网 - phpStudy...
  8. Source Map调试压缩后代码
  9. java socket 实现 http_Java Socket编程 - 基于Socket实现HTTP下载客户端
  10. C++基础教程之数组
  11. 有的时候print函数不会立即打印的解决办法(flush=True)
  12. 在校大学生如何规划自己的程序员之路
  13. fedora mysql添加密码_Fedora14下 mysql更改密码
  14. axure 7.0 注册码
  15. JDK自带的命令行工具
  16. python量化投资系统构建_零基础搭建量化投资系统 以Python为工具
  17. 02-2017.07-计算机设计大赛《盲人的眼睛》
  18. 世界坐标系(WCS)和用户坐标系UCS
  19. Pycharm 许可证过期解决
  20. 01 Java体系

热门文章

  1. MySQL 复制 主键冲突
  2. 阿里云发布Quick BIV3.0,人人都能轻松进行在线数据分析
  3. jmeter 正则表达式
  4. 让DJANGO里的get_success_url定义的reverse_lazy带参数跳转
  5. 解决注册并发问题并提高QPS
  6. 自定义注解实现日志脱敏
  7. 【MongoDB】MongoDB备份方法
  8. .net采集网页方法大全(5种)
  9. 浅谈likely与unlikely
  10. git遇到的一些小问题