第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

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

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

一只名叫tom的貓 2022-11-02 15:19:19
我想使用(反)序列化使用具有保存/加載功能的類中的數(shù)據(jù)將多個對象加載和渲染到游戲世界,但我無法弄清楚如何正確地將它們重新引入程序,因為它們包含必要的瞬態(tài)對象渲染/顯示它們。我第一次運行我的程序時,它會嘗試從不存在的名為“Data.txt”的 txt 文件中加載數(shù)據(jù)。該程序創(chuàng)建一個新的 Data.txt 文件,向其中添加一個名為“campfire”的 Campfire 對象并保存它。只要程序運行,它就會被渲染到屏幕上(這部分工作正常)。關(guān)閉程序并重新啟動它應(yīng)該檢查文件后,找到它并使用先前保存/序列化的篝火對象加載 ArrayList '數(shù)據(jù)'。然后它向它添加另一個相同類型的 Object 并渲染它們。這部分在我的 Campfire 類的渲染方法中引發(fā) 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”不存在,因為我需要對它使用瞬態(tài)關(guān)鍵字,因此它不會被保存/加載到數(shù)據(jù)文件中/從數(shù)據(jù)文件中加載。我需要一種不同的方法來根據(jù)我從中加載的數(shù)組列表創(chuàng)建對象。我無法使用 arrayList 中的對象,因為它們無法被渲染(transient 關(guān)鍵字必須分配給 Texture() 對象 - 它不可序列化)。我看過很多教程并閱讀了大量關(guān)于這個主題的文章,但我找不到一篇提到我如何重新引入對象以便我可以利用它的函數(shù),這些函數(shù)依賴于它的不可(反)序列化部分。所以這是我的問題:有沒有比我的嘗試更好的方法(再次創(chuàng)建對象然后為其分配反序列化的值?我不知道如何在反序列化過程之后正確加載和使用“數(shù)據(jù)”ArrayList,我是感謝有關(guān)如何將它們重新引入該計劃的每條建議。
查看完整描述

1 回答

?
慕沐林林

TA貢獻2016條經(jīng)驗 獲得超9個贊

我建議不要為此使用 java 序列化。它在序列化格式的大小方面可能具有優(yōu)勢,但根據(jù)我的經(jīng)驗,使用它有點痛苦。您遇到了這種痛苦,因為您無法序列化該Texture對象,因為它不是Serializable. 您通過將其標(biāo)記為瞬態(tài)來避免該問題,這是一個錯誤。可能有一些解決方法可以處理您不擁有的對象 - 注冊一些處理程序,但是我不知道細節(jié),因為我避免了它。

相反,請選擇像 json 這樣友好的格式。這意味著您的序列化數(shù)據(jù)文件會更大一些,但是,您可以打開它并閱讀它并查看您保存的內(nèi)容。

而且... libgdx 附帶了一些工具。在此處查看他們的 wiki 頁面以了解使用情況

還有其他選擇——比如谷歌的 gson 庫,但為什么不堅持使用 libgdx 的工具——我發(fā)現(xiàn)它們非常可靠。

只是一個額外的警告 - 如果您在 Android 中使用某種代碼混淆/最小化工具,您需要將其配置為不重命名您序列化的任何對象,因為它確實依賴于包和對象名稱進行反序列化。如果您保存游戲狀態(tài),也需要注意 - 然后更改對象的名稱/包,然后嘗試加載該游戲狀態(tài)。


查看完整回答
反對 回復(fù) 2022-11-02
  • 1 回答
  • 0 關(guān)注
  • 152 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號