Libgdx之数据保存 和 数据加密

Posted zqiang_55

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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();
    }

}

这里写图片描述

以上是关于Libgdx之数据保存 和 数据加密的主要内容,如果未能解决你的问题,请参考以下文章

Libgdx之XML文件解析

DRF项目之实现用户密码加密保存

可以解密加密数据的片段吗?

如何在 libGDX 上保存高分

Libgdx之Sprite 精灵类

Express实战 - 应用案例- realworld-API - 路由设计 - mongoose - 数据验证 - 密码加密 - 登录接口 - 身份认证 - token - 增删改查API(代码片段