FastJson 原理

前端之家收集整理的这篇文章主要介绍了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;
}
}

}
原文链接:https://www.f2er.com/json/289724.html

猜你在找的Json相关文章