加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

FastJson 原理

发布时间:2020-12-16 19:06:21 所属栏目:百科 来源:网络整理
导读:1 序列化:通过asm 获取对象上的属性的get方法集合,然后通过调用相应的方法拼装出json字符串。 2 反序列化:通过asm 获取对象上的属性的set方法集合,然后调用set方法集合,赋值到相应的属性。 所有的parser基本上都需要做词法处理,json也不例外。fastjson

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,加载时就分配规定的内存地址)。所以该类不适合做其他用处。

publicclassIdentityHashMap<K,V>{

publicstaticfinalintDEFAULT_TABLE_SIZE=1024;

privatefinalEntry<K,V>[]buckets;
privatefinalintindexMask;

publicIdentityHashMap(){
this(DEFAULT_TABLE_SIZE);
}

publicIdentityHashMap(inttableSize){
this.indexMask=tableSize-1;
this.buckets=newEntry[tableSize];
}
//要求必须用同一个内存分配的对象去取才可以,不然buckets定位不到,或者==判断通过重新分配的值相同的String//会有问题。
publicfinalVget(Kkey){
finalinthash=System.identityHashCode(key);
finalintbucket=hash&indexMask;

for(Entry<K,V>entry=buckets[bucket];entry!=null;entry=entry.next){
if(key==entry.key){
return(V)entry.value;
}
}

returnnull;
}

publicbooleanput(Kkey,Vvalue){
finalinthash=System.identityHashCode(key);
finalintbucket=hash&indexMask;

for(Entry<K,V>entry=buckets[bucket];entry!=null;entry=entry.next){
if(key==entry.key){
entry.value=value;
returntrue;
}
}

Entry<K,V>entry=newEntry<K,V>(key,value,hash,buckets[bucket]);
buckets[bucket]=entry;

returnfalse;
}

publicintsize(){
intsize=0;
for(inti=0;i<buckets.length;++i){
for(Entry<K,V>entry=buckets[i];entry!=null;entry=entry.next){
size++;
}
}
returnsize;
}

protectedstaticfinalclassEntry<K,V>{

publicfinalinthashCode;
publicfinalKkey;
publicVvalue;

publicfinalEntry<K,V>next;

publicEntry(Kkey,Vvalue,inthash,Entry<K,V>next){
this.key=key;
this.value=value;
this.next=next;
this.hashCode=hash;
}
}

}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读