2015-09-15 65 views
0

因此,今天我正在爲Minecraft服務器開發一個插件。爲此,我創建了一個代表賽道的「Track」類。爲了將所有現有軌道與他們的數據一起存儲,我想保存整個軌道對象,這使得我的一切都變得更加簡單。總之,我在我的Track類中實現了Serializable,以便稍後使用ObjectOutputStream。當我開始保存軌道Java創建對象的文件,但它也給我一個警告/錯誤以及:Java - NotSerializableException(保存對象)

14:19:00] [服務器線程/警告]:java.io.NotSerializableException:org .bukkit.craftbukkit.v1_8_R2.CraftWorld [14:19:00] [服務器線程/ WARN]:在java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184) [14:19:00] [服務器線程/ WARN]:在java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548) [14:19:00] [Server thread/WARN]:在java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509) [ 14:19:00] [服務器線程/ WARN]:在java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432) [14:19: 00] [Server thread/WARN]:在java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178) [14:19:00] [Server thread/WARN]:在java.io.ObjectOutputStream.writeObject(ObjectOutputStream。 [服務器線程/ WARN]:在de.avarion.speedrunners.Main.saveTracks(Main.java:206) [14:19:00] [Server thread/WARN] :at.avarion.speedrunners.Main.onDisable(Main.java:48) [14:19:00] [Server thread/WARN]:at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java: 323) [14:19:00] [服務器線程/警告]:at org.bukkit.plugin.java.JavaPluginLoader.disablePlugin(JavaPluginLoader.java:359) [14:19:00] [Server thread/WARN] :at org.bukkit.plugin.SimplePluginManager.disablePlugin(SimplePluginManager.java:424) [14:19:00] [Server thread/WARN]:at org.bukkit.plugin.Si mplePluginManager.disablePlugins(SimplePluginManager.java:417) [14:19:00] [Server thread/WARN]:at org.bukkit.craftbukkit.v1_8_R2.CraftServer.disablePlugins(CraftServer.java:335) [14:19: 00] [Server thread/WARN]:at net.minecraft.server.v1_8_R2.MinecraftServer.stop(MinecraftServer.java:458) [14:19:00] [Server thread/WARN]:at net.minecraft.server。 v1_8_R2.MinecraftServer.run(MinecraftServer.java:590) [14時十九分00秒] [Server線程/ WARN]:在java.lang.Thread.run(Thread.java:745)

這裏是我的Track類的一部分。我注意到eclipse警告我track類沒有聲明最終的靜態serialVersionUID字段。我試圖執行默認和產生的serialVersionUID,但我並沒有幫助:

import java.io.Serializable; 
import java.util.ArrayList; 

import org.bukkit.GameMode; 
import org.bukkit.Location; 
import org.bukkit.Material; 
import org.bukkit.World; 
import org.bukkit.block.Sign; 
import org.bukkit.entity.Player; 

public class Track implements Serializable { 

private int playerSize; 

private String name; 
private World world; 
private ArrayList<Player> players; 
private Location spawn; 

private Sign sign; 
private Material finishBlocks; 
private Material speedBlocks; 

public Track(World world, String name, int playerSize) { 
    this.world = world; 
    this.name = name; 
    this.playerSize = playerSize; 
    this.players = new ArrayList<Player>(); 
} 
//and so on..... 

現在,這裏是一小段代碼片段,我保存跟蹤對象:

private void saveTracks() { 
    FileOutputStream outputStream = null; 
    ObjectOutputStream objectOutput = null; 
    try { 
     File directory = new File("tracks"); 
     if(!directory.exists()) directory.mkdir(); 
     for(Track track : tracks) { 
      outputStream = new FileOutputStream("tracks/" + track.getName() + ".ser"); 
      objectOutput = new ObjectOutputStream(outputStream); 
      objectOutput.writeObject(track); 
     } 
    } 
    catch (IOException e) { 
      e.printStackTrace(); 
    } 
    finally { 
      if (objectOutput != null) try { objectOutput.close(); } catch (IOException e) {} 
      if (outputStream != null) try { outputStream.close(); } catch (IOException e) {} 
    } 
} 

所以就像我說的Java創建該對象,所以它有點作品。但我不知道如何擺脫這個警告。

感謝您的幫助

回答

1

此異常拋出,因爲一些實例字段都沒有序列化。所以請檢查所有的實例變量。如果某些實例變量不需要序列化,請將transient添加到該變量中。

作爲每Java文檔:

當需要一個實例爲具有序列化接口拋出。序列化運行時或實例的類可能會引發此異常。爭論應該是類的名字。

+0

@VGR請在評論前閱讀。我要求把暫時的這些領域不是必需的。 –

+0

好吧,所以我發現這個錯誤是由來自api的字段引起的,並且他們沒有被搜索。所以問題是將它們進行檢索,因爲我不想遺贈每一類 – AvarionDE

+0

@AvarionDE這篇文章對你有幫助 –