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;
}
}
} (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
