liangjingkanji / Serialize

🍒 Android 简单高性能读写本地数据, 直接存储对象/基础类型
http://liangjingkanji.github.io/Serialize/
Apache License 2.0
239 stars 20 forks source link

使用动态键名的默认值并没有进行隔离? #28

Closed rayzeng0221 closed 1 year ago

rayzeng0221 commented 1 year ago
var sceneMusic: Boolean by serialLazy(true, name = "scene_music_${globalMac.toMac()}_${userInfoId}")

当我第一次改变他的值为false 接着 我改变 动态键名的 变量的值,这时候再去读取值,动态键名变量已经改了,这时候读取的不应该是默认值true吗?但是读取出来的 还是 上一个动态键名的 值 false

rayzeng0221 commented 1 year ago
var globalMac = ""
var userInfoId = ""

var sceneMusic: Boolean by serialLazy(true, name = "scene_music_${globalMac}_${userInfoId}")`

// 写入
binding.cardWriteField -> {
   // name = "https://github.com/liangjingkanji/Serialize"
    //toast("写入数据: $name 到磁盘")
    globalMac = "C300000030A1"
    userInfoId = "1647308209"
    sceneMusic = false
    Log.i("zy1997", "onClick: 写入之后的值是---${sceneMusic}")
}`

// 读取
binding.cardReadField -> {
    //toast("读取本地数据为: $name")
    globalMac = "CE3431345450"
    //userInfoId = "1647308209"
    //sceneMusic = false
    Log.i("zy1997", "onClick: 写入之后的值是---${sceneMusic}")
}
rayzeng0221 commented 1 year ago

上面这段代码 是我 直接在你的Demo里面复现 的 也是一样

rayzeng0221 commented 1 year ago
截屏2023-03-08 15 36 04

我现在暂时把它改成这样手机读写就是正常的,但是这样,我所有的 都得改,成本太大了,那我上面那个写法 要怎么才可以正常呀?

liangjingkanji commented 1 year ago

原因: serialLazy对值进行缓存了

  1. 我猜测你可能想隔绝某个类的所有字段, 实际上本框架现在支持Serialize.hook拦截配置和序列化, 示例文档
  2. 关于by serialLazy默认值没有隔绝的问题你可以暂时换成by serial来解决, 其并不会缓存数据, 该问题我会马上开始进行修复(但我工作繁忙)

同时我建议迁移使用自定义序列化来存储数据, 因为默认Serialize/Parcelable等方式无法很好的兼容字段变更

rayzeng0221 commented 1 year ago

没用哦,早上已经试过了,都是一样的 。 var sceneMusic: Boolean by serial(true, name = "scene_music_${globalMac}_${userInfoId}")

liangjingkanji commented 1 year ago

使用的最新版本吗?

rayzeng0221 commented 1 year ago

使用的最新版本吗?

是啊,而且我还是直接在你的 Demo里面改的

liangjingkanji commented 1 year ago
  1. 函数参数仅会调用一次, 这是语法问题框架并不能解决, 除非将name改为函数回调

  2. 更新至最新版本将支持{}函数回调设置name: 动态键名

    private var balance: String by serial("0.0", { "balance-$userId" })
  3. 推荐使用Serialize.hook实现拦截动态配置mmapId隔离数据, 示例文档

rayzeng0221 commented 1 year ago
  1. 函数参数仅会调用一次, 这是语法问题框架并不能解决, 除非将name改为函数回调
  2. 更新至最新版本将支持{}函数回调设置name: 动态键名
    private var balance: String by serial("0.0", { "balance-$userId" })
  3. 推荐使用Serialize.hook实现拦截动态配置mmapId隔离数据, 示例文档

嗯嗯,试了最新版本的 动态键名 确实已经可以啦。感谢大佬