编辑,以下是我使用评论解决的方法 因此,在尝试了不同的序列化和查看代码的方法后,我终于发现渲染器中绘制的每个对象都包含FloatBuffers。由于Ted Hopp,我创建了一个胶囊类。然后我尝试使用.array()返回FloatBuffers的float表示,这是你不能做的。我的猜测是因为它们在线程上运行。因此,使用Learn OpenGL ES的建议来使用get,我做了
public float[] getVertexBuffer()
{
float[] local = new float[vertexBuffer.capacity()];
vertexBuffer.get(local);
return local;
}
哪个有效并返回float []。
然后我将它们全部存储在我创建的每个mGrid对象的胶囊对象中
Encapsulate capsule = new Encapsulate(values);
for(int i = 0; i < values[0]; i++)
{
for(int j = 0; j < values[1]; j++)
{
capsule.storeVertex(i,j,mRenderer.mGrid[i*values[1] + j].getVertexBuffer());
capsule.storeColors(i,j,mRenderer.mGrid[i*values[1] + j].getmColors());
capsule.storePillar(i,j,mRenderer.mGrid[i*values[1] + j].getPillarPositions());
}
}
然后我可以最终保存,因为它是可序列化的。谢谢大家
问题说明 所以我正在尝试保存一个GLSurfaceView对象,其类被表示为
class GLWorld extends GLSurfaceView implements Serializable
现在我确定我正确地进行了保存。
public void saveSimulation()
{
String fileName = "Test Save";
try {
FileOutputStream fos = openFileOutput(fileName, Context.MODE_PRIVATE);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(mGLView);
Log.d("Save","Successfully Written");
oos.close();
fos.close();
} catch (FileNotFoundException e) {
Log.d("Save","File not found exception");
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
Log.d("Save","IO exception");
// TODO Auto-generated catch block
e.printStackTrace();
}
finish();
}
但我得到一个错误,我不知道如何解决。我花了好几个小时环顾四周,但没有找到类似的东西。
09-16 17:36:50.639:W / System.err(2996):java.io.NotSerializableException:java.nio.FloatToByteBufferAdapter
除了下面还有更多的系统错误行,我认为这源于这一错误。
我的GLWorld在其中创建一个渲染器对象,该对象具有不同的对象,其中包含floatbuffers,用于存储顶点和颜色数据。我无法弄清楚如何处理此错误,或者为什么这些浮动缓冲区会抛出错误。除了实际尝试保存这个GLWorld对象之外,一切都运行顺利,这让我疯狂。
答案 0 :(得分:2)
声明类implements Serializable
不足以成功序列化该类的对象。默认实现要求类的每个字段都是可序列化的。在您的情况下,有一个FloatToByteBufferAdapter
类型的字段不可序列化(可能还有更多)。
您可以定义自己的序列化机制,仅序列化您需要的内容。详情可在Serializable
docs中找到。请注意,通过子类化GLSurfaceView
,即使您编写了正确的支持方法,也不太可能成功反序列化此类。首先,GLSurfaceView
没有默认(no-arg)构造函数,这是Java序列化机制的要求。而且,许多对象根本无法序列化(例如,流)。
我建议您将要序列化的数据封装在辅助类中,并将序列化/反序列化限制为这些数据。
答案 1 :(得分:0)
假设mGLView继承中的某些内容包含FloatTOByteBufferAdapter,它不可序列化。