首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Android 序列化框架 Gson 原理分析,可以优化吗?

配置项 Gson 类是整个库的核心 API,在进行任何序列化或反序列化之前,我们都需要获得一个 Gson 对象。...因此,在项目中有必要在 common 层提供一个全局的 Gson 对象,既有利于统一序列化配置,也是 Gson 性能优化的基本保障。...在 Gson 的反序列化中,首次反序列化一个类型的对象时,Gson 需要使用大量反射调用解析一个 TypeAdapter 适配器对象。随着 Model 的复杂程度增加,首次解析的耗时会不断膨胀。...是时候丢弃 Gson 了[6]—— bennyhuo 著 抖音 Android 性能优化系列:启动优化实践(反序列化优化)[7] —— 字节跳动技术团队 著 JSON[8] —— Wikipedia 参考资料...是时候丢弃 Gson 了: https://juejin.cn/post/6844903662783823885 [7] 抖音 Android 性能优化系列:启动优化实践(反序列化优化): https

2.4K50

【Android Protobuf 序列化】Protobuf 性能测试 ( fastjson 序列化与反序列化 | gson 序列化与反序列化 | 三种序列化与反序列化性能对比 )

一、导入依赖库 ---- 在上一篇博客 【Android Protobuf 序列化】Protobuf 使用 ( Protobuf 源码分析 | 创建 Protobuf 对象 ) 中 , 创建了 Protobuf...com.google.code.gson:gson:2.8.2' implementation 'com.alibaba:fastjson:1.1.67.android' 二、构造 JavaBean...29 ms 四、gson 序列化与反序列化 ---- 使用 gson 进行序列化与反序列化 : // 初始化 kim.hsl.protobuf.AddressBook 对象...import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.util.Log import...addPeople(person2Builder) // 将上述各个 Builder 拼装完毕后 , 最后调用 build // 即可得到最终对象 var

2.2K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Android Study 之 彻底解决 Gson解析 异常 :JsonSyntaxException

    前言 开发过程中,App常用的接收参数的时候,几乎大部分都是以json格式为主,那么有关解析json的方式有很多,Android端相对来说使用Gson比较多,而在解析过程中,如果你遇到规范的后台,那你大可放心随便浪...描述问题 实现某个功能,调用某个接口,返回如下参数: "createTime": "2017-10-26 06:46:23", "certificates": null, "certificatesPhotos...": null 大家仔细观察下,咋眼一看,也没啥问题是不?...有的值为null,有的值为“” 重点结合度娘的意见以及重新回顾Json串时,确定了是由于后台接口参数返回不规范(也就是设计不合理)导致解析失败。 ? 那么怎么解决呢?...gson = new GsonBuilder() // 重写map的反序列化 .registerTypeAdapter(new TypeToken

    4.5K10

    读懂 Android 中的代码混淆

    GSON的序列化与反序列化 GSON是一个很好的工具,使用它我们可以轻松的实现序列化和反序列化.但是当它一旦遇到混淆,就需要我们注意了....反序列化的代码 1 2 3 Gson gson = new Gson(); Item item = gson.fromJson("{\"id\":1, \"name\":\"Orange\"}", Item.class...关于调用轨迹,感兴趣的可以自己研究一下源码,不难....四大组件不建议混淆 Android中四大组件我们都很常用,这些组件不能被混淆的原因为 四大组件声明必须在manifest中注册,如果混淆后类名更改,而混淆后的类名没有在manifest注册,是不符合Android....详解Java中的注解 其他不该混淆的 jni调用的java方法 java的native方法 js调用java的方法 第三方库不建议混淆 其他和反射相关的一些情况 stacktrace的恢复 Proguard

    1.6K20

    Mson,让JSON序列化更快

    但是目前用到的Gson在序列化JSON时很慢,在读取解析这些必要的配置文件时性能不佳,导致卡顿启动速度减慢等问题。 Gson的问题在哪里呢?...图 2 如图1,可以发现Gson序列化占用了大部分的执行时间,从图2可以更直观地看到Gson.fromJson占用了61%的执行时间。...Android框架中由JSONObject来提供轻量级的JSON序列化工具,所以我选择用Android框架中的JSONObject来做序列化,然后手动复制到bean就可以去掉所有的反射。...我做了个简单的测试,分别用Gson和JSONObject的方式去序列化一个bean,看下各自速度如何。...我们可以通过使用AnnotationProcessor为带有特定注解的bean自动生成相应的序列化和反序列化实现,用户只需要调用这些方法来完成序列化工作。

    2K110

    采用Gson解析含有多种JsonObject的复杂json

    虽然这样能实现整个 json 的反序列化,但是这种方式比较麻烦,而且一点也不优雅,如果项目中存在很多这样的情况,就会做很多重复的体力劳动。...当序列化或者反序列化目标类的时候就会调用我们注册的typeAdapter, 这样就实现了人工干预 Gson 的序列化和反序列化过程。...当反序列化到对应的类的时候就会调用这个自定义 JsonDeserializer 的 deserialize() 方法。下面对这个方法的几个参数做一下解释,以便于更好的理解Gson解析的过程。 ?...gson.fromJson() 方法中的 json 是 AttributeWithType 对应的反序列化的 json,gson.fromJson() 内部会再次调用 AttributeWithType...在Android中我们反序列这样的 json 后一般会把得到的对象的设置到列表控件上,如果后端返回的 json 中包含之前未注册的类型,为了程序不至于 crash,需要对反序列化的 null 对象进行过滤

    2.4K20

    Android中JSON库性能比较

    JSON类库分别为:JSONObject、Gson、FastJson和Jackson。 简单介绍下四个类库的身份背景。 JSONObject:Android原生提供的Json处理API。...但和Gson解析不同的是,GSON可按需解析,Jackson无法按需解析。 选择一个合适的JSON库要从多个方面进行考虑:序列化与序列化的耗时及内存的消耗,还有就是代码操作是否简单。...由上述统计数据得出: 反序列化操作:总体来说,JSONObject处理速度最优,无论是处理普通Object还是List集合; 反序列化操作:随着处理量级的增大,Gson库更加费时; 序列化操作:总体依旧是...,高于其他两种方式; Jackson在序列化和反序列化时耗时都是最长的,内存消耗也是最大的,所以不建议使用Jackson。...综上,当数据量级不大时,从内存消耗和处理速度考虑,都应首选JSONObject,但JSONObject代码繁杂,容易出错,当数据量大时,不建议使用JSONObject,是因为其消耗内存过大,容易引发异常

    2.5K20

    用 gson 替换 fastjson 引发的线上问题分析

    这不,最近我们就有一个项目将 fastjson 替换为了 gson,引发了一个线上的问题。分享下这次的经历,以免大家踩到同样的坑,在此警示大家,规范千万条,安全第一条,升级不规范,线上两行泪。...整体测试结论 fastjson 序列化过后带有 $ 的引用标记也能够被 gson 正确的反序列化,但笔者并没有找到让 gson 序列化时转换成引用的配置 fastjson、hessian、java 均支持循环引用的解析...;gson 不支持 fastjson 可以设置 DisableCircularReferenceDetect,关闭循环引用和重复引用的检测 gson 反序列化之前的同一个引用的对象,在经历了序列化再反序列化回来之后...,是否支持循环对象优化,是否支持枚举类型、集合、数组、子类、多态、内部类、泛型等综合场景,以及是否支持可视化等比较的场景,增删字段后的兼容性等等特性。...不,我只是在Minecraft里管理Kubernetes... 超牛逼的 Feed 流系统设计! 阿里云网盘,开放申请啦!非会员下载 10MB/s!有图有真相! 我去!

    84720

    单例模式(singleton)之“世上安得双全法”

    } } return instance; } } 大意是:如果用不到,就不实例化,classLoader装载时,instance为null,仅在第1次调用...可惜事与愿违,java创建实例的方法不仅仅只有构造函数new这一种,可以把现有实例序列化成字符串(比如:json序列化),然后再拿json串反序列化成新对象,相当于人类的生物clone技术,虽然克隆出来的兄弟...,比如下面的代码: Gson gson = new Gson(); Single04 single04a = Single04.INSTANCE; String s04 = gson.toJson(single04a...而上述测试代码,换成前3种写法的任何1种: Gson gson = new Gson(); Single03 single03a = Single03.getInstance(); String s03...OO的世界中,还有多态呢! 如果这个单例类,需要继承自父类怎么弄? ? 终于,生活还是对我们下了狠手,人生太艰难了!enum不允许继承父类!!! 正所谓 世间安得双全法,不负如来不负卿 ?

    33620

    有意思,发现Kotlin一个神奇的bug!

    2、bug复现 现实开发中,我们经常会有将Json字符串反序列化为一个对象问题,这里,我们用Gson来写一段反序列代码,如下: fun fromJson(json: String, clazz:...的语法翻译过来的,它有一个缺点,那就是泛型的传递必须要通过另一个类去实现,上面我们借助类TypeToken类,相信这一点,很多人都不能接受,于是乎,在Kotlin上,出现了一个新的关键字reified(这里不展开介绍...同样的代码,只是所在module不一样,执行结果也不一样,你说神不神奇? 4、一探究竟 知道bug了,也知道了bug的神奇之处,接下来就去探索下,为什么会这样?从哪入手?...接着,来看看test方法,该方法有两次反序列化过程,第一次调用了静态内部类JsonfromJson2List$$inlinedfromJson$2,第二次调用了静态内部类Jsontest$$inlinedfromJson2List.../得到 List 类型 val type: Type = ParameterizedTypeImpl[List::class.java, User::class.java] 详细用法可查看Android

    93120

    Carson带你学序列化:深入分析JSON多种解析方式(Gson、AS自带org.json、Jackson)

    解析方式 Android 解析 JSON数据的方式 类似 XML解析,主要分为2大类: 下面,我将详细介绍每种方式 3.1 Android Studio自带org.json解析 解析原理:...库 在Android Gradle导入依赖 dependencies { compile 'com.google.code.gson:gson:2.3.1' } 步骤3:使用Gson进行解析 public...调用student方法展示解析的数据 student.show(); // 5....总结 本文全面介绍了现今主流的数据传输格式:JSON 关于另外1种主流的数据传输格式 XML,具体请看文章Android:XML简介 & 解析方式对比(DOM、SAX、PULL) Carson带你学序列化...Carson带你学序列化:深入源码分析Protocol Buffer Carson带你学序列化:深入分析JSON多种解析方式(Gson、AS自带org.json、Jackson) Carson带你学序列化

    1K10

    Android 混淆打包

    层下所有的类默认不会进行混淆; Parcelable的子类和Creator静态成员变量不混淆,否则会产生Android.os.BadParcelableException异常; 使用GSON、fastjson...等框架时,所写的JSON对象类不混淆,否则无法将JSON解析成对应的对象; 使用第三方开源库或者引用其他第三方的SDK包时,需要在混淆文件中加入对应的混淆规则; 有用到WEBView的JS调用也需要保证写的接口方法不混淆...; 使用enum类型时需要注意避免以下两个方法混淆,因为enum类的特殊性,以下两个方法会被反射调用 -keepclassmembers enum * {   public static **[] values...{     public static final android.os.Parcelable$Creator *; } #需要序列化和反序列化的类不能被混淆(注:Java反射用到的类也不能被混淆)...异常,添加如下代码 -dontobfuscate #不混淆输入的类文件 -dontoptimize  #不优化输入的类文件 # 不混淆 GSON -keep class com.google.gson

    1.5K30

    gson 替换 fastjson 引发的线上问题分析

    这不,最近我们就有一个项目将 fastjson 替换为了 gson,引发了一个线上的问题。分享下这次的经历,以免大家踩到同样的坑,在此警示大家,规范千万条,安全第一条,升级不规范,线上两行泪。...,可以发现 gson 并没有采取这种序列化优化策略,导致体积膨胀。...整体测试结论 fastjson 序列化过后带有 $ 的引用标记也能够被 gson 正确的反序列化,但笔者并没有找到让 gson 序列化时转换成引用的配置 fastjson、hessian、java 均支持循环引用的解析...;gson 不支持 fastjson 可以设置 DisableCircularReferenceDetect,关闭循环引用和重复引用的检测 gson 反序列化之前的同一个引用的对象,在经历了序列化再反序列化回来之后...,是否支持循环对象优化,是否支持枚举类型、集合、数组、子类、多态、内部类、泛型等综合场景,以及是否支持可视化等比较的场景,增删字段后的兼容性等等特性。

    1.8K20

    用了几年的 Fastjson,最终替换成了 Jackson!

    原因有以下几点: fastjson 太过于侧重性能,对于部分高级特性支持不够,而且部分自定义特性完全偏离了 json 和 js 规范导致和其他框架不兼容; fastjson 文档缺失较多,部分 Feature...json library json-simple vs gson vs jackson vs json 在功能特性支持、稳定性、可扩展性、易用性以及社区活跃度上 jackson 和 gson 差不多,...,fastjson 的特性由SerializerFeature控制,研究toJSONString的源码后,发现最终都会调用以下方法: public static String toJSONString(...alphabetic() default true; // 反序列化多态类型时,如果根据其他typeName等方式无法找到正确的子类时,默认使用的子类,等价于jackson的@JsonTypeInfo.defaultImpl...> builder() default Void.class; // 声明这个类型的别名,反序列化多态类型时使用,等价于jackson的@JsonTypeName String

    2.3K30

    Android 代码混淆机制

    但是如果有一些代码不能被混淆,比如引入了第三方jar文件或加入了so文件,需要调用里面的方法,那么调用JNI访问so文件的方法就不能被混码。在导出的时候,可能不会报错。...-keepnames class * implements java.io.Serializable #需要序列化和反序列化的类不能被混淆(注:Java反射用到的类也不能被混淆) -keepclassmembers....** -keep class com.google.protobuf.nano.**{*;} -dontwarn com.google.gson.** -keep class com.google.gson...(详细信息请参考\examples中的例子及注释) 3.需要序列化和反序列化的类不能被混淆。...5.过滤引入的第三方jar包,so文件和外部lib等 //过滤第三方jar包,com.google.gson替换成要想要过滤的包名 -dontwarn com.google.gson.** -keep

    1.5K20
    领券