问候,
我有一个游戏,我想将在画布上移动的对象(创作者)保存到一个包中,以便当有人暂停/离开应用程序时,对象可以保持原样。
我看过LunarLanding游戏,他们将航天飞机的坐标保存成束并从中读取,我想要做同样的事情(如果没有更好的方法)但我有自定义类型的对象,我不知道如何保存它们并从捆绑中读取。
我可以单独保存对象的所有部分并将它们重新组合在一起,但是我有很多对象,这只是丑陋的代码来完成所有这些。
如果我可以将对象保存到捆绑包中,那将是非常好的,但到目前为止,我没有运气在互联网上搜索如何这样做。
我还在考虑向我的对象实现Parcelable
,但我想知道是否还有其他方法。
有什么建议吗? 谢谢!
答案 0 :(得分:2)
基本上你有两个选择
1 - 实现Serializable,实现起来非常简单,但有一个不好的缺点就是性能。
2 - 实现Parcelable,非常快,但你需要实现解析器方法(writeToParcel()),基本上你必须手动序列化,但之后bundle会为你自动调用它产生更多的性能序列化。
答案 1 :(得分:1)
从技术上讲,如果我没记错的话,onSaveInstanceState()方法主要仅在方向更改时调用。如果要创建持久数据,则应使用onPause()或onStop()回调,并序列化游戏状态。
你可以这样做的方法是将状态存储在SQLite数据库中(似乎是过度杀伤),或者使它能够通过实现Serializable interface
来序列化跟踪实体的对象,以及将对象保存到文件中。
序列化:
@Override
public void onPause()
{
super.onPause();
FileOutputStream out = null;
try
{
out = openFileOutput("GameModelBackup",Context.MODE_PRIVATE);
try
{
ObjectOutputStream oos = new ObjectOutputStream(out);
oos.writeObject(gm);
}
catch(IOException e)
{
Log.d(this.getClass().toString(), e.getMessage());
}
}
catch(FileNotFoundException e)
{
Log.d(this.getClass().toString(), e.getMessage());
}
finally
{
try
{
if(out != null) out.close();
}
catch(IOException e)
{
Log.d(this.getClass().toString(), e.getMessage());
}
}
}
反序列化:
@Override
public void onResume()
{
super.onResume();
FileInputStream in = null;
try
{
in = openFileInput("GameModelBackup");
ObjectInputStream oos = new ObjectInputStream(in);
try
{
gm = (GameModel)oos.readObject();
}
catch(ClassNotFoundException e)
{
gm = null;
}
}
catch(IOException e)
{
Log.d(this.getClass().toString(), e.getMessage());
}
finally
{
try
{
if(in != null) in.close();
}
catch(IOException e) {}
}
}