亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

正確存儲和管理(反)序列化的對象以及反序列化后如何使用它們

正確存儲和管理(反)序列化的對象以及反序列化后如何使用它們

一只名叫tom的貓 2022-11-02 15:19:19
我想使用(反)序列化使用具有保存/加載功能的類中的數據將多個對象加載和渲染到游戲世界,但我無法弄清楚如何正確地將它們重新引入程序,因為它們包含必要的瞬態對象渲染/顯示它們。我第一次運行我的程序時,它會嘗試從不存在的名為“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 中使用某種代碼混淆/最小化工具,您需要將其配置為不重命名您序列化的任何對象,因為它確實依賴于包和對象名稱進行反序列化。如果您保存游戲狀態,也需要注意 - 然后更改對象的名稱/包,然后嘗試加載該游戲狀態。


查看完整回答
反對 回復 2022-11-02
  • 1 回答
  • 0 關注
  • 145 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號