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

还在被数据类序列化折磨?是时候丢弃 Gson

它作为一套专门为 Kotlin 类开发序列化框架,自然要兼顾到 Kotlin 类型各种特性,你会发现用 Gson序列化 Kotlin 类时遇到奇怪问题在这里都没了。...更复杂一点儿情况 假设我们有需求要讲一个 Date 序列化成一个数组,为了表达方便,我们先定义一个类: @Serializable class MyDate(var year: Int = 0, var...//省略 toString() } 我们希望下面的代码序列化结果按照数组形式输出 MyDate 当中参数: MyDate(2000, 3, 1, 10, 24, 0) 这个对象序列化之后应该输出...MyDate 对象时按数组形式输出,而 load 方法则用于反序列化。...①构造方法默认值 这事儿还真不是说 Gson 不是,Gson 作为 Java 生态重要一员,尽管它速度不是最快,但他接口最好用啊,所以写 Java 时候每次测试 Maven 库时候我都会用引入

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

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

2、bug复现 现实开发,我们经常会有将Json字符串反序列化为一个对象问题,这里,我们用Gson来写一段反序列代码,如下: fun fromJson(json: String, clazz:...当我们满怀信心测试以上代码时,问题出现了,List反序列化失败了,如下: List里面的对象竟不是User,而是LinkedTreeMap,怎么回事,这难道就是标题所说Kotlinbug...对象,而Gson在收到泛型不明确时,便会自动将json对象反序列化为LinkedTreeMap对象。...难道这就是标题说Kotlinbug?很负责任告诉你,是的; bug神奇在哪里?...文件没有这个方法 上面代码,分别执行了app module和base modulefromJson2List方法,我们来猜一猜上面代码执行预期结果 第一条语句,有了上面的案例,显然会返回List

90120

Kotlin 泛型之类型擦除

Java 泛型优点包括: 类型安全 消除强制类型转换 避免了不必要装箱、拆箱操作,提高程序性能 提高代码重用性 下面,以我缓存框架 RxCache Memory 接口为例: package...,Java 数组并没有受到类型擦除影响。...因为,Java 数组是协变,所以 Java 数组不支持泛型。 协变是在计算机科学,描述具有父/子型别关系多个型别通过型别构造器、构造出多个复杂型别之间是否有父/子型别关系用语。 四....Kotlin 如何获得声明泛型类型 跟 Java 一样,Kotlin 也是通过类型擦除支持泛型。 但是 Kotlin 数组支持泛型,因此它们并不会协变。...; class [Ljava.lang.String; 4.2 实例化类型参数代替类引用 再举一个 Kotlin 使用 Gson 序列化例子,可以使用实例化类型参数 T::class.java inline

1.7K30

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

配置项 Gson 类是整个库核心 API,在进行任何序列化或反序列化之前,我们都需要获得一个 Gson 对象。...因此,在项目中有必要在 common 层提供一个全局 Gson 对象,既有利于统一序列化配置,也是 Gson 性能优化基本保障。...不过,如果需要用到完整数据结构(例如根据 type 字段按照不同类型解析 data),也可以手动解析为树型结构。因此 TypeAdapter 这个 API 优先级更高。...[ 左括号,再用元素类型 TypeAdapter 依次序列化元素对象,再写入 ] 右括号; 3、在反序列化时,先创建集合对象,再用元素类型 TypeAdapter 依次反序列化元素对象; 4、Map...在 Gson 序列化,首次反序列化一个类型对象时,Gson 需要使用大量反射调用解析一个 TypeAdapter 适配器对象。随着 Model 复杂程度增加,首次解析耗时会不断膨胀。

2.2K50

找出数组第 K 大整数(排序)

题目 给你一个字符串数组 nums 和一个整数 k 。 nums 每个字符串都表示一个不含前导零整数。 返回 nums 中表示第 k 大整数字符串。...注意:重复数字在统计时会视为不同元素考虑。 例如,如果 nums 是 [“1”,“2”,“2”],那么 “2” 是最大整数,“2” 是第二大整数,“1” 是第三大整数。...示例 1: 输入:nums = ["3","6","7","10"], k = 4 输出:"3" 解释: nums 数字按非递减顺序排列为 ["3","6","7","10"] 其中第 4 大整数是..."3" 示例 2: 输入:nums = ["2","21","12","1"], k = 3 输出:"2" 解释: nums 数字按非递减顺序排列为 ["1","2","12","21"] 其中第...3 大整数是 "2" 示例 3: 输入:nums = ["0","0"], k = 2 输出:"0" 解释: nums 数字按非递减顺序排列为 ["0","0"] 其中第 2 大整数是 "0"

81630

Gson 系列文章

JSON 序列化和反序列化入门 Java-JSON 序列化基础 先来看一些序列化例子,Gson 序列化意味着将 Java 对象映射成 JSON 数据格式,在接下来教程,我们会逐步介绍一些更复杂情况...在 JSON 数据格式,不存在数组等结构,只是 Java 具体实现使得这两种数据类型有很大不同。但是在上层它们表示出相同结构。...Array 首先看解析成数组,通过 Gson gson.fromJson 方法,我们很简单GSON 解析成数组,注意这里传递参数是 Founder[].class 而不是Founder.class...简化自定义序列化 List 为数组 针对上一节问题,我们只需要修改 serialize方法实现即可,不在使用 JsonObject,而是使用 JsonArray,实现如下: Merchant merchant1...Advanced — 通过 @JsonAdapter 自定义()序列化 之前我们介绍了如何使用 Gson 来自定义()序列化和自定义实例创建。

15.2K10

kotlin gson序列化默认值失效深入讲解

Gson序列化原理 原理简述 gson序列化主要分为两个过程: 根据TypeToken创建出对象 根据json字符串解析数据,对对象属性赋值 对象创建 ConstructorConstructor.get...for this type may fix this problem."), e); } } }; } 结论 Gson反序列要工作正常,使结果符合预期的话,要求类必须有一个无参构造函数 kotlin...) { init { println("init") } } 反编译Java代码 包含两个构造函数,一个是我们声明全参数构造函数,另一个是kotlin生成辅助构造函数 不包含无参构造函数...= 0) { var2 = ""; } this(var1, var2); } } gson序列化输出 代码: @Test fun testJson() { val user...反序列化输出 代码: @Test fun testJson() { val user = Gson().fromJson("{}", User::class.java) print(user.name

1.4K20

你应该知道kotlin实用技巧

,直接调用setRoundRectBg即可,简单方便 reified使用 reified,kotlin泛型实化关键字,使抽象东西更加具体或真实。...Gson解析例子 我们首先看下一般我们使用gson解析json是怎么做 在Java序列化库(如Gson,当您想要反序列化该JSON字符串时,您最终必须将Class对象作为参数传递,以便Gson...,在我们Kotlin代码,我们可以反序列化JSON字符串,甚至根本不需要传递类型信息!...val user: User = Gson().fromJson(json) Kotlin根据它用法推断出类型 - 因为我们将它分配给User类型变量,Kotlin使用它作为fromJson()类型参数...称之为 SAM Type ),在 Kotlin 可以直接用 Lambda 来表示 —— 当然前提是 Lambda 所表示函数类型能够跟接口中方法相匹配。

1.5K10

Gson:我爸是 Google

Gradle 构建脚本使用是 Groovy 或 Kotlin 特定领域语言来编写,而不是传统 XML。...2)可以序列化 140 万个对象集合。 3)可以反序列化包含 87000 个对象集合。 4)将字节数组和集合序列化限制从 80K 提高到 11M 以上。...3)如果一个字段被 transient 关键字修饰的话,它将不参与序列化。 4)如果一个字段值为 null,它不会在序列化结果显示。...5)JSON 缺少字段将在反序列化后设置为默认值,引用数据类型默认值为 null,数字类型默认值为 0,布尔值默认为 false。 接下来,来看一个序列化集合例子。...使用 toJson() 序列化 Java 对象时,返回 JSON 字符串没有空格,很紧凑。

90320

你应该知道kotlin实用技巧

,直接调用setRoundRectBg即可,简单方便 reified使用 reified,kotlin泛型实化关键字,使抽象东西更加具体或真实。...Gson解析例子 我们首先看下一般我们使用gson解析json是怎么做 在Java序列化库(如Gson,当您想要反序列化该JSON字符串时,您最终必须将Class对象作为参数传递,以便Gson知道您想要类型...,在我们Kotlin代码,我们可以反序列化JSON字符串,甚至根本不需要传递类型信息!...val user: User = Gson().fromJson(json) Kotlin根据它用法推断出类型 - 因为我们将它分配给User类型变量,Kotlin使用它作为fromJson()类型参数...称之为 SAM Type ),在 Kotlin 可以直接用 Lambda 来表示 —— 当然前提是 Lambda 所表示函数类型能够跟接口中方法相匹配。

1.4K00

NoArg 插件 invokeInitializers 配置

上周时候 Kotlin 1.3 发布了,由于之前 RC 版本以及 KotlinConf 造势很多,所以正式版出来之后大家就改个版本号,把协程 experimental 去掉,就差不多了。...而后者,本身就是一个整型,不被初始化,访问时就是默认 0。 前面我们已经有文章提到过这个现象,包括对于 Gson序列化数据类时候出现种种问题中,也有些与此有关。...还在被数据类序列化折磨?...是时候丢弃 Gson 了 数据类增加nonNull字段反序列化坑 其实 NoArg 配置还有一个叫 invokeInitializers 家伙,你可以这么配置: noArg{ invokeInitializers...过去我之前好几次看到它,并尝试配置,结果用 IntelliJ Kotlin 插件自带 "Show Kotlin Bytecode" 看了之后,发现生成构造器没有任何变化: public

49410

Android避坑指南,GsonKotlin碰撞出一个不安全操作

我们先想下通过Java创建对象大概有哪些方式: new Student() // 私有 反射调用构造方法 //throw ex 反序列化 // 需要实现相关序列化接口 clone // 需要实现clone...问题来源 上周一个群有个小伙伴,遇到了一个KotlinBean,在做Gson将字符串转化成具体Bean对象时,发生了一个不符合预期问题。...对于Java Bean,kotlin可以用data class,网上也有很多博客表示: 在 Kotlin ,不需要自己动手去写一个 JavaBean,可以直接使用 DataClass,使用 DataClass...运行一下: 没有执行父类构造方法,但对象构造出来了 这里可以猜到,Person对象构建,并不是常规构建对象,没有走构造方法。 那么它是怎么做到呢? 那只能去Gson源码取找答案了。...看到这里,大家可能最大收获就是了解Gson构建对象流程,以及以后写Bean时候会注意提供默认无参构造方法,尤其在使用Kotlin data class时候。

1.3K20

小心,在数据类当中用 Lazy 要谨慎!

不过如果我们定义了需要在主构造器执行代码,那么就可能会有点儿麻烦了。...trump.firstName) 输出就是: Donald 那么问题来了,一般来说数据类都是免不了要序列化和反序列化,所以有可能普爷是从硬盘上来: val trump = Gson().fromJson...原因是 Person 这个类没有无参构造方法,所以 Gson 会用 Unsafe 去实例化它,这样的话主构造器就被跳过了。...小结 数据类初始化往往会突破 Kotlin 语言安全条件,这让我们代码处于危险境地。...因此对于需要序列化数据类情景,大家在编写代码时还是需要多加注意,不要在数据类当中写有特定初始化逻辑属性,反序列化场景,这样属性无法保证被正确地初始化。

99710
领券