[英]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.