mirror of https://github.com/alibaba/fastjson2.git
add reader codegen doc
This commit is contained in:
parent
46c8df2a73
commit
555c4ed1ba
|
|
@ -0,0 +1,125 @@
|
|||
# 反序列化CodeGen算法介绍
|
||||
fastjson2会使用codegen来优化反序列化的性能,用到的codegen技术包括:
|
||||
* ASM 基于内置asm 9.2裁剪版实现的动态字节码生成类
|
||||
* Annotation Process Tools(APT)
|
||||
|
||||
## 实现算法介绍
|
||||
|
||||
我们要将json反序列化为如下的Image类
|
||||
```java
|
||||
@Data
|
||||
public class Image {
|
||||
private int height;
|
||||
private Size size;
|
||||
private String title;
|
||||
private String uri;
|
||||
private int width;
|
||||
}
|
||||
```
|
||||
|
||||
需要生成如下的代码来快速将json中的name和字段关联起来:
|
||||
```java
|
||||
public final class Image_FASTJOSNReader
|
||||
extends com.alibaba.fastjson2.reader.ObjectReader5 {
|
||||
|
||||
public Object readObject(
|
||||
com.alibaba.fastjson2.JSONReader jsonReader,
|
||||
java.lang.reflect.Type fieldType,
|
||||
Object fieldName,
|
||||
long features
|
||||
) {
|
||||
Image object = new Image();
|
||||
|
||||
while (!jsonReader.nextIfObjectEnd()) {
|
||||
switch (jsonReader.getRawInt()) {
|
||||
// '"' | ('w' << 8) | ('i' << 16) | ('d' << 24) == 1684633378
|
||||
// 'd' | ('h' << 8) | ('"' << 16) | (':' << 24) == 975333492
|
||||
case 1684633378: // "wid
|
||||
if (jsonReader.nextIfName4Match5(975333492)) { // th":
|
||||
object.setWidth(
|
||||
jsonReader.readInt32Value()
|
||||
);
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
// '"' | ('h' << 8) | ('e' << 16) | ('i' << 24) == 1768253474
|
||||
// 'g' | ('h' << 8) | ('t' << 16) | ('"' << 24) == 578054247
|
||||
case 1768253474: // "hei
|
||||
if (jsonReader.nextIfName4Match6(578054247)) { // ght"
|
||||
object.setHeight(
|
||||
jsonReader.readInt32Value()
|
||||
);
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
// '"' | ('u' << 8) | ('r' << 16) | ('i' << 24) == 1769108770
|
||||
case 1769108770: // "uri"
|
||||
if (jsonReader.nextIfName4Match3()) {
|
||||
object.setUri(
|
||||
jsonReader.readString()
|
||||
);
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
// ...
|
||||
default:
|
||||
break;
|
||||
}
|
||||
// ....
|
||||
}
|
||||
return object;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
相关方法在JSONReader中的实现
|
||||
```java
|
||||
class JSONReaderUTF8 implements JSONReader {
|
||||
public final int getRawInt() {
|
||||
if (offset + 3 < bytes.length) {
|
||||
return UNSAFE.getInt(bytes, ARRAY_BYTE_BASE_OFFSET + offset - 1);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
public boolean nextIfName4Match3() {
|
||||
offset += 5;
|
||||
|
||||
if (bytes[offset - 2] != '"' || bytes[offset - 1] != ':') {
|
||||
return false;
|
||||
}
|
||||
|
||||
// ...
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public final boolean nextIfName4Match4(byte c4) {
|
||||
offset += 6;
|
||||
if (bytes[offset - 3] != c4 || bytes[offset - 2] != '"' || bytes[offset - 1] != ':') {
|
||||
return false;
|
||||
}
|
||||
// ...
|
||||
return true;
|
||||
}
|
||||
|
||||
public boolean nextIfName4Match5(int name1) {
|
||||
offset += 7;
|
||||
if (UNSAFE.getInt(bytes, ARRAY_BYTE_BASE_OFFSET + offset - 4) != name1) {
|
||||
return false;
|
||||
}
|
||||
// ...
|
||||
return true;
|
||||
}
|
||||
|
||||
public boolean nextIfName4Match6(int name1) {
|
||||
offset += 8;
|
||||
if (UNSAFE.getInt(bytes, ARRAY_BYTE_BASE_OFFSET + offset - 5) != name1 || bytes[offset - 1] != ':') {
|
||||
return false;
|
||||
}
|
||||
// ...
|
||||
return true;
|
||||
}
|
||||
}
|
||||
```
|
||||
Loading…
Reference in New Issue