Libgdx之数据保存 和 数据加密

来源:互联网 发布:2015十大网络用语 编辑:程序博客网 时间:2024/06/01 10:12

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();    }}

这里写图片描述

1 0