检查kotlinx-serialization-json的bean类是否都加了@Serializable注解

news/2024/5/20 4:12:27 标签: kotlin, ksp, kmm, android, json, gradle

前言

json解析框架有很多,但Kotlin跨平台只能使用kotlinx-serialization-json

kotlinx-serialization-json使用的时候需要给bean类加上注解,不然运行时会报错,如下:

@Serializable
class HelpBean(
    val key: String,
    val value: String,
)

而官方没有提供检查是否bean类都加注解,或者一键给某个包自动加注解的功能,导致可能会出现运行时的崩溃,所以我们可以自己用ksp写个程序来检查一下

正文

ksp基础使用可以参考:使用KSP处理注解和生成Kotlin代码

我们可以在SymbolProcessor的子类的process方法中这样写:

//获取所有文件的列表
resolver.getAllFiles().filter {
    //过滤只有符合自己要检查的包名的类才去检查是否加了@Serializable注解
    it.packageName.asString() == packageName
}.map {
    //拿到文件中所有的类
    it.declarations.mapNotNull {
        //过滤是Class类型的
        it as? KSClassDeclaration
    }.filter {
        //过滤是Class类型的
        it.classKind == ClassKind.CLASS
    }
}.flatten()
    .forEach {
        //遍历上面拿到的所有符合条件的类,然后获取类上的@Serializable注解
        if (it.getAnnotationsByType(Serializable::class).toList().isEmpty()) {
            //如果没有则打印error日志,如果打印了error日志,则会自动在gradle build过程中报错
            environment.logger.error(
                "class: $it Serializable annotation not added",
                it//将文件位置打印出来
            )
        }
    }
//如果没有报错则说明指定的包中所有类都加了注解了

end,代码注释都很清楚


http://www.niftyadmin.cn/n/476436.html

相关文章

CNN应用:文本情感预测

数据示例如下所示, UserName,ScreenName,Location,TweetAt,OriginalTweet,Sentiment 3799,48751,London,16-03-2020,MeNyrbie Phil_Gahan Chrisitv https://t.co/iFz9FAn2Pa and https://t.co/xX6ghGFzCC and https://t.co/I2NlzdxNo8,Neutral 3800,48752,UK,16-03-…

油烟机语音方案:NV040D语音芯片,支持MCU输入UART指令

随着人们生活水平的提高和厨房使用频率的增加,油烟机成为现代家庭生活中必不可少的一种家用电器,而语音智能化技术的发展也使得油烟机功能更加智能化。九芯电子的NV040D语音芯片是一种具备MCU输入UART指令功能的专业语音芯片,可以广泛应用于油…

WPF中对Halcon的DrawingObject支持

我下载的是Halcon-18.11。首先这是可以参考例程的。 例程地址C:\Users\Public\Documents\MVTec\HALCON-18.11-Progress\examples\c#\DrawingObjectsWPF 首先定义一个HSmartWindowControlWPF <HalconDotNet:HSmartWindowControlWPF x:Name"halconWin"RenderOptio…

Linux学习之以openresty为例学习源码安装软件

https://github.com/openresty/openresty/tags里边有openresty各个版本的源码。 https://openresty.org/en/是官网。 wget https://github.com/openresty/openresty/archive/refs/tags/v1.15.8.1.tar.gz(github网址)或者wget https://openresty.org/download/openresty-1.15.…

从vivo X90S看手机影像叙事的三重境界

出品 | 何玺 排版 | 叶媛 6月26日&#xff0c;vivo X90s新机宣布开启预售。 作为X90系列的“小迭代”产品&#xff0c;这款新机在影像体验上进一步提升&#xff0c;用直指人心的质感色彩&#xff0c;为X90系列动人的“影像叙事”开启了崭新章节。 01 从“高保值”的影像旗舰…

如何在uniapp的onshow 接受参数?

在日常使用uniapp开发&#xff0c;我们正常接受参数的方式如下&#xff1a; 正常页面 onLoad 可以接收上个页面的参数 onLoad(options) {const data options.data;if (data) {this.formData JSON.parse(data);}},但是 onLoad() 页面只会加载一次。 现在有这么一个应用场景&…

C++小结(2)

std::cout << "Count is " << count << std::endl;std 是标准库函数使用的命名空间&#xff0c;是 standard&#xff08;标准&#xff09;的缩写。 using namespace std &#xff0c;它声明了命名空间 std&#xff0c;后续如果有未指定命名空间的…

【裸机开发】GPT 定时器(三) —— 使用GPT实现高精度延时

延时最简单粗暴的方式就是使用空循环来延时&#xff0c;依赖的是时钟主频&#xff08;默认是396M&#xff09;来计数&#xff0c;一旦修改了 6ull 的时钟主频&#xff0c;延时效果就会存在偏差。 因此我们可以使用 EPIT 或者 GPT 的计数功能实现高精度延时&#xff0c;EPIT 是…