Data 模块是自定义数据结构和类型转换模块,提供了 JSON 序列化/反序列化工具、缓冲区管理和 Gson 扩展功能。该模块封装了常用的数据处理操作,提供了安全可靠的数据转换机制。
// 全局 Gson 实例,集成扩展适配器工厂
val gson: Gson
// 安全的序列化方法(异常时返回 null)
fun toJsonErrorNull(obj: Any?): String?
// 安全的反序列化方法
inline fun <reified T> froJsonErrorNull(json: String?): T?
fun <T> froJsonErrorNull(json: String?, clazz: Class<T>): T?
fun <T> froJsonErrorNull(json: String?, typeOfT: Type): T?
class AutoExtendByteBuffer(initSize: Int) {
// 写入不同类型的数据
fun putInt(value: Int)
fun putFloat(value: Float)
fun putString(value: String?)
// 获取数据
fun array(): ByteArray
fun position(): Int
// 内部自动扩容
private fun ensureSize(allocate: Int)
}
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface GsonNullable {
// 标记字段可以为空
}
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface Must {
// 标记必须字段
}
// 安全序列化
val jsonString = toJsonErrorNull(dataObject)
if (jsonString != null) {
// 序列化成功
saveJson(jsonString)
} else {
// 序列化失败,已记录日志
}
// 安全反序列化
val dataObject = froJsonErrorNull<MyData>(jsonString)
if (dataObject != null) {
// 反序列化成功
processData(dataObject)
} else {
// 反序列化失败,已记录日志
}
// 使用 Class 类型反序列化
val result = froJsonErrorNull(jsonString, MyData::class.java)
// 使用 Type 反序列化泛型
val listType = object : TypeToken<List<MyData>>() {}.type
val dataList = froJsonErrorNull<List<MyData>>(jsonString, listType)
// 创建缓冲区(初始大小 1024 字节)
val buffer = AutoExtendByteBuffer(1024)
// 写入不同类型数据
buffer.putInt(42)
buffer.putFloat(3.14f)
buffer.putString("Hello World")
// 获取最终数据
val byteArray = buffer.array()
val currentPosition = buffer.position()
// 自动扩容示例
val smallBuffer = AutoExtendByteBuffer(16) // 初始 16 字节
repeat(100) {
smallBuffer.putInt(it) // 自动扩容到足够大小
}
data class UserData(
@Must val id: String, // 必须字段
@GsonNullable val name: String?, // 可空字段
val email: String // 普通字段
) : IJsonConfig
// 序列化时会根据注解进行特殊处理
val json = toJsonErrorNull(userData)
// 获取配置好的 Gson 实例
val customGson = gson
// 使用标准 Gson API
val json = customGson.toJson(dataObject)
val obj = customGson.fromJson(json, MyData::class.java)
// AutoExtendByteBuffer 的扩容策略
private fun ensureSize(allocate: Int) {
val newPosition = allocate + position
var capacity = buffer.capacity()
// 容量不足时,按 2 的幂次递增
while (newPosition > capacity) {
capacity = capacity shl 1 // 容量翻倍
}
// 创建新缓冲区并拷贝数据
val newBuffer = ByteBuffer.allocate(capacity)
buffer.flip()
newBuffer.put(buffer)
buffer = newBuffer
}
所有 JSON 处理方法都集成了统一的异常处理:
gson - Google JSON 库kotlin-stdlib - Kotlin 标准库androidx.core.ktx - Android Core 扩展frame:base - 基础模块(日志功能)frame:zero - 零依赖模块frame:network - 网络模块使用 JSON 处理frame:storage - 存储模块使用数据序列化implementation "com.wenext.android:frame-data:6.0.0"