2014-03-12 2 views
0

코드에 두 개의 배열 목록이 있습니다. 하나는 사용자 객체를 저장하고, 다른 하나는 팀 객체를 저장합니다. 내가하려고하는 것은 close 명령어가 두 배열리스트를 파일에 저장 한 다음 프로그램을 닫을 때이다.커스텀 객체 직렬화의 Arraylist

둘 다 AL을 절약하는 데 문제가 있었지만 serialVersionUID를 정의하고 사용자 AL 만 제대로 정의했습니다. 팀 AL의 오류가 발생했습니다.

오류 절약 :

14:29:46 [SEVERE] java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: org.bukkit.Location 
14:29:46 [SEVERE]  at java.io.ObjectInputStream.readObject0(Unknown Source) 
14:29:46 [SEVERE]  at java.io.ObjectInputStream.defaultReadFields(Unknown Source) 
14:29:46 [SEVERE]  at java.io.ObjectInputStream.readSerialData(Unknown Source) 
14:29:46 [SEVERE]  at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source) 
14:29:46 [SEVERE]  at java.io.ObjectInputStream.readObject0(Unknown Source) 
14:29:46 [SEVERE]  at java.io.ObjectInputStream.readObject(Unknown Source) 
14:29:46 [SEVERE]  at java.util.ArrayList.readObject(Unknown Source) 
14:29:46 [SEVERE]  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
14:29:46 [SEVERE]  at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
14:29:46 [SEVERE]  at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
14:29:46 [SEVERE]  at java.lang.reflect.Method.invoke(Unknown Source) 
14:29:46 [SEVERE]  at java.io.ObjectStreamClass.invokeReadObject(Unknown Source) 
14:29:46 [SEVERE]  at java.io.ObjectInputStream.readSerialData(Unknown Source) 
14:29:46 [SEVERE]  at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source) 
14:29:46 [SEVERE]  at java.io.ObjectInputStream.readObject0(Unknown Source) 
14:29:46 [SEVERE]  at java.io.ObjectInputStream.readObject(Unknown Source) 
14:29:46 [SEVERE]  at plugin.Configs.loadTeams(Configs.java:129) 
14:29:46 [SEVERE]  at plugin.UltimateSurvival.onEnable(UltimateSurvival.java:82) 
14:29:46 [SEVERE]  at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:217) 
14:29:46 [SEVERE]  at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:457) 
14:29:46 [SEVERE]  at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:381) 
14:29:46 [SEVERE]  at org.bukkit.craftbukkit.v1_6_R3.CraftServer.loadPlugin(CraftServer.java:284) 
14:29:46 [SEVERE]  at org.bukkit.craftbukkit.v1_6_R3.CraftServer.enablePlugins(CraftServer.java:266) 
14:29:46 [SEVERE]  at org.bukkit.craftbukkit.v1_6_R3.CraftServer.reload(CraftServer.java:615) 
14:29:46 [SEVERE]  at org.bukkit.Bukkit.reload(Bukkit.java:277) 
14:29:46 [SEVERE]  at org.bukkit.command.defaults.ReloadCommand.execute(ReloadCommand.java:23) 
14:29:46 [SEVERE]  at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:192) 
14:29:46 [SEVERE]  at org.bukkit.craftbukkit.v1_6_R3.CraftServer.dispatchCommand(CraftServer.java:528) 
14:29:46 [SEVERE]  at net.minecraft.server.v1_6_R3.PlayerConnection.handleCommand(PlayerConnection.java:968) 
14:29:46 [SEVERE]  at net.minecraft.server.v1_6_R3.PlayerConnection.chat(PlayerConnection.java:886) 
14:29:46 [SEVERE]  at net.minecraft.server.v1_6_R3.PlayerConnection.a(PlayerConnection.java:837) 
14:29:46 [SEVERE]  at net.minecraft.server.v1_6_R3.Packet3Chat.handle(SourceFile:49) 
14:29:46 [SEVERE]  at net.minecraft.server.v1_6_R3.NetworkManager.b(NetworkManager.java:296) 
14:29:46 [SEVERE]  at net.minecraft.server.v1_6_R3.PlayerConnection.e(PlayerConnection.java:116) 
14:29:46 [SEVERE]  at net.minecraft.server.v1_6_R3.ServerConnection.b(SourceFile:37) 
14:29:46 [SEVERE]  at net.minecraft.server.v1_6_R3.DedicatedServerConnection.b(SourceFile:30) 
14:29:46 [SEVERE]  at net.minecraft.server.v1_6_R3.MinecraftServer.t(MinecraftServer.java:592) 
14:29:46 [SEVERE]  at net.minecraft.server.v1_6_R3.DedicatedServer.t(DedicatedServer.java:227) 
14:29:46 [SEVERE]  at net.minecraft.server.v1_6_R3.MinecraftServer.s(MinecraftServer.java:488) 
14:29:46 [SEVERE]  at net.minecraft.server.v1_6_R3.MinecraftServer.run(MinecraftServer.java:421) 
14:29:46 [SEVERE]  at net.minecraft.server.v1_6_R3.ThreadServerApplication.run(SourceFile:583) 
14:29:46 [SEVERE] Caused by: java.io.NotSerializableException: org.bukkit.Location 
14:29:46 [SEVERE]  at java.io.ObjectOutputStream.writeObject0(Unknown Source) 
14:29:46 [SEVERE]  at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source) 
14:29:46 [SEVERE]  at java.io.ObjectOutputStream.writeSerialData(Unknown Source) 
14:29:46 [SEVERE]  at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source) 
14:29:46 [SEVERE]  at java.io.ObjectOutputStream.writeObject0(Unknown Source) 
14:29:46 [SEVERE]  at java.io.ObjectOutputStream.writeObject(Unknown Source) 
14:29:46 [SEVERE]  at java.util.ArrayList.writeObject(Unknown Source) 
14:29:46 [SEVERE]  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
14:29:46 [SEVERE]  at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
14:29:46 [SEVERE]  at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
14:29:46 [SEVERE]  at java.lang.reflect.Method.invoke(Unknown Source) 
14:29:46 [SEVERE]  at java.io.ObjectStreamClass.invokeWriteObject(Unknown Source) 
14:29:46 [SEVERE]  at java.io.ObjectOutputStream.writeSerialData(Unknown Source) 
14:29:46 [SEVERE]  at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source) 
14:29:46 [SEVERE]  at java.io.ObjectOutputStream.writeObject0(Unknown Source) 
14:29:46 [SEVERE]  at java.io.ObjectOutputStream.writeObject(Unknown Source) 
14:29:46 [SEVERE]  at plugin.Configs.saveTeams(Configs.java:52) 
14:29:46 [SEVERE]  at plugin.UltimateSurvival.onDisable(UltimateSurvival.java:91) 
14:29:46 [SEVERE]  at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:219) 
14:29:46 [SEVERE]  at org.bukkit.plugin.java.JavaPluginLoader.disablePlugin(JavaPluginLoader.java:481) 
14:29:46 [SEVERE]  at org.bukkit.plugin.SimplePluginManager.disablePlugin(SimplePluginManager.java:400) 
14:29:46 [SEVERE]  at org.bukkit.plugin.SimplePluginManager.disablePlugins(SimplePluginManager.java:393) 
14:29:46 [SEVERE]  at  org.bukkit.plugin.SimplePluginManager.clearPlugins(SimplePluginManager.java:434) 
14:29:46 [SEVERE]  at org.bukkit.craftbukkit.v1_6_R3.CraftServer.reload(CraftServer.java:585) 
14:29:46 [SEVERE]  ... 17 more 

오류로드 :

14:29:46 [SEVERE] java.io.NotSerializableException: org.bukkit.Location 
14:29:46 [SEVERE]  at java.io.ObjectOutputStream.writeObject0(Unknown Source) 
14:29:46 [SEVERE]  at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source) 
14:29:46 [SEVERE]  at java.io.ObjectOutputStream.writeSerialData(Unknown Source) 
14:29:46 [SEVERE]  at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source) 
14:29:46 [SEVERE]  at java.io.ObjectOutputStream.writeObject0(Unknown Source) 
14:29:46 [SEVERE]  at java.io.ObjectOutputStream.writeObject(Unknown Source) 
14:29:46 [SEVERE]  at java.util.ArrayList.writeObject(Unknown Source) 
14:29:46 [SEVERE]  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
14:29:46 [SEVERE]  at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
14:29:46 [SEVERE]  at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
14:29:46 [SEVERE]  at java.lang.reflect.Method.invoke(Unknown Source) 
14:29:46 [SEVERE]  at java.io.ObjectStreamClass.invokeWriteObject(Unknown Source) 
14:29:46 [SEVERE]  at java.io.ObjectOutputStream.writeSerialData(Unknown Source) 
14:29:46 [SEVERE]  at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source) 
14:29:46 [SEVERE]  at java.io.ObjectOutputStream.writeObject0(Unknown Source) 
14:29:46 [SEVERE]  at java.io.ObjectOutputStream.writeObject(Unknown Source) 
14:29:46 [SEVERE]  at plugin.Configs.saveTeams(Configs.java:52) 
14:29:46 [SEVERE]  at plugin.UltimateSurvival.onDisable(UltimateSurvival.java:91) 
14:29:46 [SEVERE]  at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:219) 
14:29:46 [SEVERE]  at org.bukkit.plugin.java.JavaPluginLoader.disablePlugin(JavaPluginLoader.java:481) 
14:29:46 [SEVERE]  at org.bukkit.plugin.SimplePluginManager.disablePlugin(SimplePluginManager.java:400) 
14:29:46 [SEVERE]  at org.bukkit.plugin.SimplePluginManager.disablePlugins(SimplePluginManager.java:393) 
14:29:46 [SEVERE]  at org.bukkit.plugin.SimplePluginManager.clearPlugins(SimplePluginManager.java:434) 
14:29:46 [SEVERE]  at org.bukkit.craftbukkit.v1_6_R3.CraftServer.reload(CraftServer.java:585) 
14:29:46 [SEVERE]  at org.bukkit.Bukkit.reload(Bukkit.java:277) 
14:29:46 [SEVERE]  at org.bukkit.command.defaults.ReloadCommand.execute(ReloadCommand.java:23) 
14:29:46 [SEVERE]  at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:192) 
14:29:46 [SEVERE]  at org.bukkit.craftbukkit.v1_6_R3.CraftServer.dispatchCommand(CraftServer.java:528) 
14:29:46 [SEVERE]  at net.minecraft.server.v1_6_R3.PlayerConnection.handleCommand(PlayerConnection.java:96 
14:29:46 [SEVERE]  at net.minecraft.server.v1_6_R3.PlayerConnection.chat(PlayerConnection.java:886) 
14:29:46 [SEVERE]  at net.minecraft.server.v1_6_R3.PlayerConnection.a(PlayerConnection.java:837) 
14:29:46 [SEVERE]  at net.minecraft.server.v1_6_R3.Packet3Chat.handle(SourceFile:49) 
14:29:46 [SEVERE]  at net.minecraft.server.v1_6_R3.NetworkManager.b(NetworkManager.java:296) 
14:29:46 [SEVERE]  at net.minecraft.server.v1_6_R3.PlayerConnection.e(PlayerConnection.java:116) 
14:29:46 [SEVERE]  at net.minecraft.server.v1_6_R3.ServerConnection.b(SourceFile:37) 
14:29:46 [SEVERE]  at net.minecraft.server.v1_6_R3.DedicatedServerConnection.b(SourceFile:30) 
14:29:46 [SEVERE]  at net.minecraft.server.v1_6_R3.MinecraftServer.t(MinecraftServer.java:592) 
14:29:46 [SEVERE]  at net.minecraft.server.v1_6_R3.DedicatedServer.t(DedicatedServer.java:227) 
14:29:46 [SEVERE]  at net.minecraft.server.v1_6_R3.MinecraftServer.s(MinecraftServer.java:488) 
14:29:46 [SEVERE]  at net.minecraft.server.v1_6_R3.MinecraftServer.run(MinecraftServer.java:421) 
14:29:46 [SEVERE]  at net.minecraft.server.v1_6_R3.ThreadServerApplication.run(SourceFile:583) 

이것은 내가 현재 개발 오전 마인 크래프트 플러그인의 일부입니다. 일부 코드 :

public class Team implements Serializable 
{ 
private static final long serialVersionUID = 6482400621090209853L; 
private String name = ""; 
private int points = 0; 
private int size = 0; 
private Location spawn = null; 
} 

public void loadTeams() 
{ 
    try{ 
     FileInputStream file = new FileInputStream ("plugins/UltimateSurvival/teams.bin"); 
     ObjectInputStream ois = new ObjectInputStream(file); 
     UltimateSurvival.teams = (ArrayList<Team>)ois.readObject(); 
     file.close(); 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
} 

public void saveTeams() 
{ 
    try 
    { 
     FileOutputStream file = new FileOutputStream ("plugins/UltimateSurvival/teams.bin"); 
     ObjectOutputStream oos = new ObjectOutputStream(file); 
     oos.writeObject(UltimateSurvival.teams); 
     file.close(); 
    } 
    catch(Exception e) 
    { 
     e.printStackTrace(); 
    } 

나는 직렬화에 대해 조금 읽었지만, 그것은 내 첫 접촉이다. 내가 뭔가 잘못하고 있는거야? 사전에

덕분에

+1

당신이 어떤 오류를받을 수 있나요? 스크린 샷에 대한 링크를 게시하는 대신 전체 스택 추적을 복사하여 붙여 넣으십시오. –

+0

'Location'은 직렬화 할 수 없습니다. 이것이 말한 것입니다. 그것을 직렬화 할 수 있습니다, 그것은'Team' 객체로부터 참조됩니다 – hoaz

+0

나는 바보 같은 존재입니다 ... 그러나 한가지 문제가 있습니다,이'Location'은 저에게 만들어지지 않았고 bukkit 라이브러리에 속합니다 . 직렬화 할 수있는 방법이 있습니까? –

답변

0

귀하의 문제는 Location이다는 직렬화되지 않습니다 :

java.io.NotSerializableException: org.bukkit.Location 

먼저, 그것은 직렬화 할 문자열로 변환하려면 : worldName, x, y, z, 당신은 할 수 이것을 사용하십시오 :

public String locationToString(Location l){ 
    String world = l.getWorld().getName(); //get the world name 
    Double x = l.getX(); //get the x coordinate 
    Double y = l.getY(); //get the y coordinate 
    Double z = l.getZ(); //get the z coordinate 

    return world + "," + x + "," + y + "," + z; //return the location, but in string form 
} 

그런 다음, t 문자열에서 그 위치, 당신이 할 수 있습니다 :

public Location stringToLocation(String s){ 
    String[] str = s.split(","); //split s by ',' 
    World world = Bukkit.getWorld(str[0]); //get the world 
    Double x = Double.parseDouble(str[1]); //get the x coord 
    Double y = Double.parseDouble(str[2]); //get the y coord 
    Double z = Double.parseDouble(str[3]); //get the z coord 

    return new Location(world, x, y, z); //return a location created from the String 
} 

을 이렇게, 당신은 지금 당신이 배열에 넣을 수 있습니다 locationToString()를 사용하여 StringLocation를 변환 한 다음, 당신은 밖으로 String를 취할 수 있습니다 배열을 열고 stringToLocation()을 사용하여 Location으로 변환합니다.

+0

컴퓨터에서 몇 시간 정도 떨어져 나에게 비슷한 해결책을주었습니다. 위치를 직렬화 할 수있는 것보다 훨씬 더 나은 옵션입니다. 모든 도움을 주셔서 감사합니다. –

1

나는이 단지

package tv.usasvideos.survivalgameteams; 

import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutputStream; 

public class SaveLoadList { 
    public static void save(Object obj,String path) throws Exception { 
     try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(path))) { 
      oos.writeObject(obj); 
      oos.flush(); 
     } 
    } 

    public static Object load(String path) throws Exception { 
     Object result; 
     try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(path))) { 
      result = ois.readObject(); 
     } 
     return result; 
    } 
} 

private List<ChestPoint> chestpoints = new ArrayList<>(); 

@Override 
public void onEnable(){ 
    try { 
     chestpoints = (List<ChestPoint>)SaveLoadList.load("chestpoints.bin"); 
    } catch (Exception ex) { 
     Logger.getLogger(SurvivalGame.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

@Override 
public void onDisable(){ 
    try { 
     SaveLoadList.save(chestpoints,"chestpoints.bin"); 
    } catch (Exception ex) { 
     Logger.getLogger(SurvivalGame.class.getName()).log(Level.SEVERE, null, ex); 
    } 
}