java - Java 对象的可序列化错误

标签 java android serialization opengl-es-2.0

编辑,这是我使用评论解决的方法 所以在尝试了不同的序列化方式并查看了我的代码之后,我终于发现渲染器中绘制的每个对象都包含 FloatBuffers。感谢 Ted Hopp,我创建了一个胶囊类(class)。然后我尝试使用 .array() 返回 FloatBuffers 的浮点表示,这是你做不到的。我的猜测是因为它们在线程上运行。所以使用 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 在其中创建了一个渲染器对象,该渲染器对象具有不同的对象,其中包含存储顶点和颜色数据的 float 缓冲区。我不知道该怎么做才能克服这个错误,或者为什么那些 float 缓冲区会抛出错误。一切都运行顺利,除了实际尝试保存这个 GLWorld 对象,这让我发疯。

最佳答案

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

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

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

关于java - Java 对象的可序列化错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18839628/

相关文章:

c# - C# 中的无符号右移对负数使用 Java 语义

android - 更新 Gradle 和插件后出错

左侧的 Android 填充文本不起作用

c# - MONO 客户端和 ASP.NET 服务器之间的序列化/反序列化 - 可能吗?

java - 反序列化对象列表

java - 使用 Java 读取非常大的文件

java - 从数据库到文件的多个图像检索与java

java - 如何在 Gradle 中查找/删除未使用的依赖项

android - 滑动菜单上的奇怪偏移行为

python - 没有 ORM、DOM 或表单的对象模式/模型