mamoe / mirai

高效率 QQ 机器人支持库
https://mirai.mamoe.net
GNU Affero General Public License v3.0
14.44k stars 2.54k forks source link

JAutoSavePluginData未能实现持久化 #1747

Closed hundun000 closed 2 years ago

hundun000 commented 2 years ago

问题描述

即使JAutoSavePluginData里只有Value(基础数据类型)的成员,其写出的文件内容也只有最外层的{},无任何成员。

如果JAutoSavePluginData目前已经是无法使用且暂无人维护修复,建议修改开发文档中的描述,例如指出Mirai Console不再提供PluginData的Java适配器——JAutoSavePluginData。

复现

如下Test可通过测试,运行结束后data/org.test.test/testSaveName.yml内容为{}

import net.mamoe.mirai.console.data.Value;
import net.mamoe.mirai.console.data.java.JAutoSavePluginData;
import net.mamoe.mirai.console.plugin.PluginManager;
import net.mamoe.mirai.console.plugin.jvm.JavaPlugin;
import net.mamoe.mirai.console.plugin.jvm.JvmPluginDescriptionBuilder;
import net.mamoe.mirai.console.terminal.MiraiConsoleImplementationTerminal;
import net.mamoe.mirai.console.terminal.MiraiConsoleTerminalLoader;

public class DataTest {

    public static class MyData extends JAutoSavePluginData {
        public static final MyData INSTANCE = new MyData();
        public MyData() { super("testSaveName"); }
        public final Value<String> strMember = value("str");
        public final Value<Integer> intMember = value(1);
    }

    public static class MockPlugin extends JavaPlugin {
        public static final MockPlugin INSTANCE = new MockPlugin();
        public MockPlugin() {
            super(new JvmPluginDescriptionBuilder("org.test.test", "1.0.0").build());
        }
    }

    @Before
    public void beforeTest() {
        MiraiConsoleTerminalLoader.INSTANCE.startAsDaemon(new MiraiConsoleImplementationTerminal());
        PluginManager.INSTANCE.loadPlugin(MockPlugin.INSTANCE);
    }

    @Test
    public void testData() {
        MockPlugin.INSTANCE.reloadPluginData(MyData.INSTANCE);
        assertEquals("str", MyData.INSTANCE.strMember.get());
        assertEquals(Integer.valueOf(1), MyData.INSTANCE.intMember.get());
    }

}

mirai-core 版本

2.8.0

bot-protocol

ANDROID_PHONE

其他组件版本

No response

系统日志

网络日志

补充信息

相关论坛帖子

Him188 commented 2 years ago

只是时间不足,测试可能没覆盖全

建议使用 Kotlin 写 PluginData 的定义,或自行实现其他方案在 dataFolder 存储