当前位置:网站首页>Understand the deserialization principle of fastjson for generics

Understand the deserialization principle of fastjson for generics

2022-07-07 05:57:00 Coriander Chat Game

fastjson It is a very common one now json Serialization and deserialization tools , It was released by Alibaba , Although it has been thundering recently , Various vulnerabilities , But this does not affect our learning from him .

fastjson Use

Join the rely on

stay pom.xml Direct increase in fastjson Just rely on , This way down

<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>fastjson</artifactId>
  <version>1.2.75</version>
</dependency>

Regular use

public static void main(String[] args) {
    TreeNode treeNode = new TreeNode(10);
        // To string 
    String jsonStr = JSON.toJSONString(treeNode);
        //  String to object 
    TreeNode treeNode1 = JSON.parseObject(jsonStr, TreeNode.class);
    System.out.println();
}

The use of generics

Take a look at our commonly used deserialization

List<TreeNode>  list = JSON.parseObject("",new TypeReference<List<TreeNode>>(){});

First explain : TypeReference Is a generic class , Holds the current type

The deserialization of generics here , How to achieve it ? How do you know what generic types need to be serialized at runtime ? Learn some knowledge today , It's also what I want to record today .

Source code

If you want to understand the principle, you have to dig the source code , It's no wonder to understand

Knowledge point 1 An anonymous class

new TypeReference<List>(){}

This line of code is to create an anonymous class , Equivalent to creating a class implementation TypeReference , Then you instantiate it . Don't get confused , Because we usually use interfaces , such as Runnable, If you are not familiar with it, you can review

Knowledge point 2 a key

Just click in TypeReference This class , You can see the following constructor

protected TypeReference(){
    Type superClass = getClass().getGenericSuperclass();
    //  Here's the point , It seems that you can get generic information 
    Type type = ((ParameterizedType) superClass).getActualTypeArguments()[0];

    Type cachedType = classTypeCache.get(type);
    if (cachedType == null) {
        classTypeCache.putIfAbsent(type, type);
        cachedType = classTypeCache.get(type);
    }

    this.type = cachedType;
}

Type type = ((ParameterizedType) superClass).getActualTypeArguments()[0];

This function is rarely used in development , Even as an old driver, I haven't used this function , Have you used it ?

This sentence must be remembered , It is also the most important way to implement generics , It must be superclass, Also made a strong turn . Then switch to the type you want to use Note that there

summary

So just to conclude ,fastjson The underlying principle of deserialization of generics is based on type deserialize , The knowledge point is An anonymous class and getActualTypeArguments Finally, leave an assignment , You can simulate such a scenario , If you need to know the type of generics at runtime in development , This method can be used

 

原网站

版权声明
本文为[Coriander Chat Game]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/188/202207070034219717.html