我想使用(反)序列化使用具有保存/加載功能的類中的數據將多個對象加載和渲染到游戲世界,但我無法弄清楚如何正確地將它們重新引入程序,因為它們包含必要的瞬態對象渲染/顯示它們。我第一次運行我的程序時,它會嘗試從不存在的名為“Data.txt”的 txt 文件中加載數據。該程序創建一個新的 Data.txt 文件,向其中添加一個名為“campfire”的 Campfire 對象并保存它。只要程序運行,它就會被渲染到屏幕上(這部分工作正常)。關閉程序并重新啟動它應該檢查文件后,找到它并使用先前保存/序列化的篝火對象加載 ArrayList '數據'。然后它向它添加另一個相同類型的 Object 并渲染它們。這部分在我的 Campfire 類的渲染方法中引發 NullPointerException。這是主類:public class MainClass extends ApplicationAdapter{public static SpriteBatch batch; private Data data;private Campfire campfire;@Overridepublic void create () { batch = new SpriteBatch(); data = new Data(); data.load(); campfire = new Campfire(); data.addCampfire(campfire); System.out.println(data.getSize()); data.save();}@Overridepublic void render () { Gdx.gl.glClearColor(0, 0, 0, 1); Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); batch.begin(); data.render(batch); batch.end();}加載所有文件的類:public class Data {private String filename;private ArrayList<Campfire> data; public Data() { data = new ArrayList<Campfire>(); filename = "Data.txt"; } public void save(){ try { FileOutputStream file = new FileOutputStream (filename); ObjectOutputStream out = new ObjectOutputStream (file); out.writeObject(data); out.close(); file.close(); }catch (IOException e) {e.printStackTrace();} }public void load() { try { FileInputStream file = new FileInputStream (filename); ObjectInputStream in = new ObjectInputStream(file); data = (ArrayList<Campfire>)in.readObject(); in.close(); file.close(); } 原因是紋理“img”不存在,因為我需要對它使用瞬態關鍵字,因此它不會被保存/加載到數據文件中/從數據文件中加載。我需要一種不同的方法來根據我從中加載的數組列表創建對象。我無法使用 arrayList 中的對象,因為它們無法被渲染(transient 關鍵字必須分配給 Texture() 對象 - 它不可序列化)。我看過很多教程并閱讀了大量關于這個主題的文章,但我找不到一篇提到我如何重新引入對象以便我可以利用它的函數,這些函數依賴于它的不可(反)序列化部分。所以這是我的問題:有沒有比我的嘗試更好的方法(再次創建對象然后為其分配反序列化的值?我不知道如何在反序列化過程之后正確加載和使用“數據”ArrayList,我是感謝有關如何將它們重新引入該計劃的每條建議。
1 回答

慕沐林林
TA貢獻2016條經驗 獲得超9個贊
我建議不要為此使用 java 序列化。它在序列化格式的大小方面可能具有優勢,但根據我的經驗,使用它有點痛苦。您遇到了這種痛苦,因為您無法序列化該Texture
對象,因為它不是Serializable
. 您通過將其標記為瞬態來避免該問題,這是一個錯誤。可能有一些解決方法可以處理您不擁有的對象 - 注冊一些處理程序,但是我不知道細節,因為我避免了它。
相反,請選擇像 json 這樣友好的格式。這意味著您的序列化數據文件會更大一些,但是,您可以打開它并閱讀它并查看您保存的內容。
而且... libgdx 附帶了一些工具。在此處查看他們的 wiki 頁面以了解使用情況
還有其他選擇——比如谷歌的 gson 庫,但為什么不堅持使用 libgdx 的工具——我發現它們非常可靠。
只是一個額外的警告 - 如果您在 Android 中使用某種代碼混淆/最小化工具,您需要將其配置為不重命名您序列化的任何對象,因為它確實依賴于包和對象名稱進行反序列化。如果您保存游戲狀態,也需要注意 - 然后更改對象的名稱/包,然后嘗試加載該游戲狀態。
添加回答
舉報
0/150
提交
取消