簡體   English   中英

Java對象的可序列化錯誤

[英]Serializable Errors with Java Object

編輯,這是我如何使用注釋解決的方法。因此,在嘗試了不同的序列化方式並查看代碼后,我終於發現渲染器中繪制的每個對象都包含FloatBuffers。 感謝Ted Hopp,我創建了一個膠囊課程。 然后,我嘗試使用.array()返回FloatBuffers的float表示形式,這是做不到的。 我的猜測是因為它們在線程上運行。 因此,根據學習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在其中創建了一個渲染器對象,該對象具有不同的對象,其中的浮點緩沖區用於存儲頂點和顏色數據。 我不知道該怎么做才能克服此錯誤,或者為什么這些浮動緩沖區會引發錯誤。 除了實際嘗試保存此GLWorld對象外,一切都運行順利,這使我發瘋。

僅聲明一個類implements Serializable不足以成功地序列化該類的對象。 默認實現要求該類的每個字段都可序列化。 在您的情況下,存在一個FloatToByteBufferAdapter類型的字段,該字段不可序列化(可能還有更多)。

您可以定義自己的序列化機制以僅序列化您需要的序列化。 詳細信息可以在Serializable文檔中找到。 請注意,通過子類化GLSurfaceView ,即使您編寫了正確的支持方法,也不太可能成功地反序列化此類。 一方面, GLSurfaceView沒有默認的(無參數)構造函數,這是Java序列化機制的要求。 而且,許多對象根本無法序列化(例如,流)。

我建議您將要序列化的數據封裝在一個幫助器類中,並將序列化/反序列化限制為這些數據。

必須假定mGLView繼承中的某些內容包含FloatTOByteBufferAdapter,該對象不可序列化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM