看源码了解Gson excludeStrategy的使用

使用exclude strategy的场景:

我们知道Gson 序列化的时候通常有些字段不需要seralize到json中去,gson给我们提供了一个annotaion,Expose
定义:


@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Expose {
public boolean serialize() default true;
public boolean deserialize() default true;
}

可见作用域是field,生效时期是在运行时
用法:
@Expose(deserialize = true,serialize = true) 两个参数代表field支不支持序列化与反序列化
gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create()
根据方法名字可以得知Gson把没有被Expose字段标注的field都不会在tojson fromjson时生效,当我们tojson的使用只有很少的filed不需要序列化反序列化的时候,就需要使用expose标注很多的字段,对于程序员来说这当然是不可接受的,exclude stragety应运而生
用法:
1: 定义GsonIgnore注解

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface GsonIgnore {
}

注意一定要是runtime,之前定义了class,在运行时并不能通过反射类方法getannotaion获取出来注解对象
2: 定义

Gson = new GsonBuilder().setExclusionStrategies(new ExclusionStrategy() {
    @Override
    public boolean shouldSkipField(FieldAttributes f) {
        return f.getAnnotation(GsonIgnore.class) != null;
    }

    @Override
    public boolean shouldSkipClass(Class<?> clazz) {
        return false;
    }
}).create();

流程图如下:具体的代码在excluder的exludefield中,expose注解处理也在这个类中,有兴趣可以看下

这里写图片描述

ps:之前有个同事跟我说Gson的创建时间特别长我当时天真的相信了居然毫无验证,Gson的创建很快,但如果在循环中调用会频繁创建释放对象造成内存抖动,所以可以在utils中用单例来创建Gson对象

参考:
https://juejin.im/entry/570115041ea4930055ffae57
http://blog.csdn.net/qinxiandiqi/article/details/39118351

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值