View Code? Open in Web Editor
NEW
🍒 Android 简单高性能读写本地数据, 直接存储对象/基础类型
Home Page: http://liangjingkanji.github.io/Serialize/
License: Apache License 2.0
serialize's People
serialize's Issues
var sceneMusic: Boolean by serialLazy(true , name = " scene_music_${globalMac.toMac()} _${userInfoId} " )
当我第一次改变他的值为false 接着 我改变 动态键名的 变量的值,这时候再去读取值,动态键名变量已经改了,这时候读取的不应该是默认值true吗?但是读取出来的 还是 上一个动态键名的 值 false
将需要引入kotlin-serialization库来实现本功能
不再兼容旧版本数据恢复
java.lang.IllegalStateException: Cannot invoke setValue on a background thread
at androidx.lifecycle.LiveData.assertMainThread(LiveData.java:487)
at androidx.lifecycle.LiveData.setValue(LiveData.java:306)
at androidx.lifecycle.MutableLiveData.setValue(MutableLiveData.java:50)
at com.drake.serialize.serialize.SerializeLiveDataDelegate.getValue(SerializeDelegate.kt:149)
at com.drake.serialize.serialize.SerializeLiveDataDelegate.getValue(SerializeDelegate.kt:117)
目前使用官方新推出的api感觉使用起来有点麻烦😂我想要是能用你提供的界面传递参数跳转Activity的写法,在后面加个大括号,用lambda表达式的写法获取到返回的数据执行后续操作就好了🤔
@parcelize
data class MtbAStdTFEntity(
var CurrentMax: Double = 0.0,
var CurrentMin: Double = 0.0,
var Duration: Int = 0,
var Freq: Int = 0,
var item: Int = 0
) : Parcelable
object MtbaSet {
var listStdTF : MutableList by serialLazy()
}
通过对listStdTF赋值后发现只是内存中数据改,没有保存到磁盘,app重启启动时候没有数据,是否用法有问题
var SearchHistory : MutableList <String >? by serialLazy()
if (AppConfig .SearchHistory .isNullOrEmpty()) {
AppConfig .SearchHistory = mutableListOf ()
}
fun updateKey (keyStr : String ) {
AppConfig .SearchHistory ?.let {
it.add(0 , keyStr)
historyAdapter.setList(it)
}
}
@SerializeConfig(mmapID = " app_config" )
object ViewConfig {
private val def = Position (0f , 0f )
var textV: Position by serial(default = def)
data class Position (var x : Float , var y : Float ) : Serializable {
companion object {
private const val serialVersionUID = - 7L
}
}
}
读取直接
赋值是
val viewConfig = ViewConfig
viewConfig.textV.x = x
viewConfig.textV.y = y
但是这样并不能写入数据,这是哪里出错了
0-0 用json就没问题
首先这是个很棒的库,我们项目也使用kotlin委托实现了读写变量自动保存本地的功能,但是没有提供可观察的LiveData,楼主提供了很好的思路。但是有个小问题和楼主交流一下:
SharedPreferences/MMKV/DataStore设计本意就是存储轻量级的key-value数据,直接提供hook来序列化复杂数据是否违背了初衷呢?个人认为,对于重要的结构化数据,数据库是首选,轻量级数据使用SP/MMKV,但对于一些不需要数据库建表那么重,又不适合直接存SP的数据,做本地文件缓存是比较合适的。
所以,是否可以再抽象一下,
上层依赖接口,不依赖MMKV,可以提供默认的MMKV实现
把轻量级的KV数据和结构化的数据分开来,比如分为property和storage,property数据不提供序列化功能,storage底层使用文件缓存,提供SerializeHook
当存储Serializable的数据时,新增字段,大概率数据丢失,有啥办法解决
我有个引导页,执行完引导页后,改变Flag,然后立马杀掉进程,重新打开APP 又重新出现引导页了,打印值,又变成默认值,目前就是第一次会出现,第二次杀进程再进入APP就是正常,这是必现。
我使用的是动态键名:
// 是否显示P80引导页 var isShowHomeGuideP80: Boolean by serialLazy(true,"isShowHomeGuideP80_${userId}")
请问 importFromSharedPreferences
导入配置后,怎么读取值呢?key 还是 config + keyName 么?
我是想调用的时候方便点不用再用类名调用,但是不加类名好像 by serilizer()就会报错
存储数据key的问题
命名规则的逻辑,key的前缀使用类名拼接属性的名称,通过mmkv存储到磁盘的数据,只能在存储的当前页面使用,而其他页面因为类名不同,无法获取到通过mmkv存入到磁盘的数据。代码如下:
override fun setValue (thisRef : Any ?, property : KProperty <*>, value : V ) {
// 使用代理的对象的 class 名称
val className = thisRef ?.javaClass ?.name
// 属性名称或者自定义名称
var adjustKey = name ?: property .name
// adjustKey 和使用代理的类绑定了,导致其他类无法获取到 adjustKey
// 除非提前知道哪个代理存储了数据,手动拼接代理类的className + name ,当然这种方式不现实。
if (className != null ) adjustKey = "${className}.${adjustKey}"
kv .serialize (adjustKey to value )
}
override fun getValue (thisRef : Any ?, property : KProperty <*>): V {
val className = thisRef ?.javaClass ?.name
var adjustKey = name ?: property .name
if (className != null ) adjustKey = "${className}.${adjustKey}"
return if (default == null ) {
kv .deserialize (adjustKey )
} else {
kv .deserialize <V >(adjustKey , default )
}
}
你好,应用中原来已经使用了 Preferences 存储了一些字段,能怎样迁移过来呢?
我的项目正在使用 kotlinx.serialization,有这样一个类:
@Serializable data class LoginDto( @SerialName("accountId") val accountId: String?, @SerialName("address") val address: String?, @SerialName("appRole") val appRole: String? )
这应该就是算序列化了吧? 但是保存之后当时有效,但是当我退出应该重新进入APP,这时候对象就是获取为空了。
avatar可以,nickname就不可以了
开始我还以为 是我代码问题,反复确认了好多遍问题还是出在 这个本地存储上,我的登录状态是是用这个来保存的 但是版本升级覆盖安装后,好像所有保存的值全没了,本来登录过了,覆盖安装后又重新进入了登录页面
这个正常吗?是日志还是保存的数据?
调用了ProtoBuf.serializersModule
这是保存在Serialize里的数据
var ConfigList : ArrayList <Model > by serialLazy(
arrayListOf (
PrintModel (" " , true , true ),
PrintModel (" " , true , true ),
PrintModel (" " , true , true )
)
)
这是修改数据后重新保存的操作
AppConfig .ConfigList = adapter.data as ArrayList <Model >
每次打开app后数据是没问题的,但是覆盖安装后数据就没了,请问是这样写的吗😂
您好,请问一下编写SerializeHook后怎么使用?
java.io.StreamCorruptedException
invalid stream header: 7400000E
解析原始
1
java.lang.RuntimeException : java.lang.reflect.InvocationTargetException
2
com.android.internal.os.RuntimeInit $MethodAndArgsCaller .run (RuntimeInit .java: 558 )
3
......
4
Caused by:
5
java.io.StreamCorruptedException : invalid stream header: 7400000E
6
java.io.ObjectInputStream .readStreamHeader(ObjectInputStream .java: 863 )
7
java.io.ObjectInputStream .<init>(ObjectInputStream .java: 354 )
8
com.drake.serialize.serialize.SerializeHook $DefaultImpls .deserialize(SerializeHook .java: 79 )
9
com.drake.serialize.serialize.SerializeHook $DEFAULT .deserialize(SerializeHook .java: 21 )
10
com.drake.serialize.serialize.SerializeKt .deserialize(SerializeKt .java: 68 )
11
com.drake.serialize.serialize.delegate.SerialLazyDelegate .getValue(SerialLazyDelegate .java: 52 )
12
com.video.videochat.constants.AppConfigData .getAppLanguage(AppConfigData .java: 31 )
13
com.video.videochat.user.bean.RegisterReqBean .<init>(RegisterReqBean .java: 27 )
14
com.video.videochat.user.ui.LoginActivity $onClick$1 $1 .invoke(LoginActivity .java: 126 )
15
com.video.videochat.user.ui.LoginActivity $onClick$1 $1 .invoke(LoginActivity .java: 125 )
16
com.video.videochat.user.ui.LoginActivity .judgeAgreement(LoginActivity .java: 158 )
17
com.video.videochat.user.ui.LoginActivity .onClick(LoginActivity .java: 125 )
defaultMMKV(int mode, @nullable String cryptKey)