Java对象的可序列化错误

时间:2013-09-17 00:50:40

标签: java android serialization opengl-es-2.0

编辑,以下是我使用评论解决的方法 因此,在尝试了不同的序列化和查看代码的方法后,我终于发现渲染器中绘制的每个对象都包含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对象之外,一切都运行顺利,这让我疯狂。

2 个答案:

答案 0 :(得分:2)

声明类implements Serializable不足以成功序列化该类的对象。默认实现要求类的每个字段都是可序列化的。在您的情况下,有一个FloatToByteBufferAdapter类型的字段不可序列化(可能还有更多)。

您可以定义自己的序列化机制,仅序列化您需要的内容。详情可在Serializable docs中找到。请注意,通过子类化GLSurfaceView,即使您编写了正确的支持方法,也不太可能成功反序列化此类。首先,GLSurfaceView没有默认(no-arg)构造函数,这是Java序列化机制的要求。而且,许多对象根本无法序列化(例如,流)。

我建议您将要序列化的数据封装在辅助类中,并将序列化/反序列化限制为这些数据。

答案 1 :(得分:0)

假设mGLView继承中的某些内容包含FloatTOByteBufferAdapter,它不可序列化。