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之数据保存 和 数据加密的主要内容,如果未能解决你的问题,请参考以下文章
Express实战 - 应用案例- realworld-API - 路由设计 - mongoose - 数据验证 - 密码加密 - 登录接口 - 身份认证 - token - 增删改查API(代码片段