Libgdx之数据保存 和 数据加密

Libgdx 中使用Preference以哈希表的形式进行数据的保存,在桌面版保存在目录”.prefs”下面,注意所有桌面的Preference都保存在.prefs目录下,所以文件名最好以”com.myname.game1.settings”而不是”Settings”
只有调用方法flush才会将数据从内存保存到磁盘上
Gdx.app.getPreferences(String filename)来创建Preference实例
public boolean contains (String key);
public void clear ();
public void remove (String key);
/* Makes sure the preferences are persisted. /
public void flush ();

这样保存数据是明文保存的,有时候我们需要加密数据,不想任何人都可以看到和修改,这时我们需要使用Base64Coder来进行加密。
现在我们先看Preferences进行数据保存的代码,之后再看加密的代码
Preferences保存数据

public class PreferenceTest extends ApplicationAdapter {
    Preferences pre;
    SpriteBatch sb;
    BitmapFont bf;

    @Override
    public void create() {
        pre = Gdx.app.getPreferences("PreferenceTest");

        pre.putBoolean("IsBool", true);
        pre.putInteger("IsInt", 2);
        pre.putString("IsString", "Libgdx");
        pre.flush();

        sb = new SpriteBatch();
        bf = new BitmapFont();
    }

    @Override
    public void render() {
        Gdx.gl.glClearColor(0.39f, 0.58f, 0.92f, 1.0f);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

        sb.begin();
        bf.draw(sb, "IsBoole=" + pre.getBoolean("IsBool") + "  IsInt=" + pre.getInteger("IsInt") + "  IsString=" + pre.getString("IsString"), 40, 40);
        sb.end();
    }


    @Override
    public void dispose() {
        sb.dispose();
        bf.dispose();
    }

}

这里写图片描述

使用Base64Coder加密操作的代码,示例比较简单,首先需要一个辅助类-DataSaveSecurity-来加密解密数据,

public class DataSaveSecurity {
    private Save save;
    private FileHandle file = Gdx.files.local("bin/scores.json");

    public DataSaveSecurity() {
        save = getSave();
    }

    private Save getSave() {
        Save save = new Save();

        if (file.exists()) {
            Json json = new Json();
            // 读取文件,并且解密
            save = json.fromJson(Save.class, Base64Coder.decodeString(file.readString()));
        }
        return save;
    }

    public void saveToJson() {
        Json json = new Json();
        json.setOutputType(OutputType.json);
        file.writeString(Base64Coder.encodeString(json.prettyPrint(save)), false);
    }

    public void saveDataValue(String key, Object object){
        save.data.put(key, object);
        saveToJson(); // 立即保存数据

    }

    public Integer loadDataValue(String key, Class<Integer> type){
        // 如果包含key的数据则返回数据,否则返回null
        if(save.data.containsKey(key))  
            return (Integer) save.data.get(key);
        else 
            return null;
    }
    /** 根据需要T替换要读取的类型
     * public <T> T loadDataValue(String key, Class type){
        if(save.data.containsKey(key))return (T) save.data.get(key);
        else return null;   //this if() avoids exception, but check for null on load.

    }
     */
    private static class Save {
        public ObjectMap<String, Object> data = new ObjectMap<String, Object>();
    }
}

之后是对数据的操作

public class DataSecurityTest extends ApplicationAdapter {

    SpriteBatch sb;
    BitmapFont bf;
    DataSaveSecurity dataSaveSecurity;

    @Override
    public void create() {
        sb = new SpriteBatch();
        bf = new BitmapFont();

        dataSaveSecurity = new DataSaveSecurity();
        for (int i = 0; i < 3; i++) {
            dataSaveSecurity.saveDataValue("data"+i, 100+i);
        }
    }

    @Override
    public void render() {
        Gdx.gl.glClearColor(0.39f, 0.58f, 0.92f, 1.0f);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

        sb.begin();
        bf.draw(sb, ""+dataSaveSecurity.loadDataValue("data0", Integer.class), 40, 40);
        bf.draw(sb, ""+dataSaveSecurity.loadDataValue("data1", Integer.class), 40, 80);
        bf.draw(sb, ""+dataSaveSecurity.loadDataValue("data2", Integer.class), 40, 120);
        sb.end();
    }

    @Override
    public void dispose() {
        sb.dispose();
        bf.dispose();
    }

}

这里写图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值