2012-06-10 63 views
2

我想知道是否有一種簡單的方法來保存對象的數組,而不必經過並保存對象的每個方面。在我的例子中,我有兩個數組,一個是單個數組,另一個是二維數組,其中包含引用自定義類的對象。每個對象都有特定的細節,如x和y整數,布爾值,字符串等。 (block [0] .x,block [0] .canWalk,block [0] .name),我想知道是否有一種簡單的方法可以將這些數組保存到文件中,而無需使用for循環,保存每個部分。多維陣列是簡單地保存數組的數組等同於第一個(savedBlock [0] [0] .X ...)保存自定義類對象的數組

什麼我迄今(拋NotSerializableException):

public class Save 
{ 
    static File f; 
    static ObjectOutputStream os; 
    public static void openFile() 
    { 
     try 
     { 
      if(!new File("c:\\IDsGame").exists()) 
      { 
       new File("c:\\IDsGame").mkdirs(); 
      } 

      f = new File("c:\\IDsGame\\data.bin"); 
      os = new ObjectOutputStream(new FileOutputStream(f)); 

      writeFile(); 
     } 
     catch(Exception e) 
     { 
      System.err.println("creating file"); 
     } 
    } 

    public static void writeFile() 
    { 
     try 
     { 
      ArrayList<Object> map = new ArrayList<Object>(Arrays.asList(Map.block)); 
      ArrayList<Object> savedMaps = new ArrayList<Object>(Arrays.asList(Map.savedMaps)); 
      os.writeObject(map); 
      os.writeObject(savedMaps); 
      os.close(); 
     } 
     catch (IOException e) {System.out.println(e);} 

    } 
} 

在我的地圖類中,我初始化塊(Blocks [])和savedMaps(Blocks [] [])。我的塊類持有這樣的:

public class Blocks implements Serializable 
{ 
    public boolean canWalk, onTop, itemTaken; 
    public Image img = null, imgBack = null; 
    public final Image (a ton of different images) 
    public String name, item, message, title; 
    public char initMap, initEx, initIt; 
    public int x, y, height, width; 

    public Blocks() 
    { 
     canWalk = true; 
     onTop = false; 
     itemTaken = false; 
     img = null; 
     name = null; 
     item = null; 
     message = null; 
     x = 0; 
     y = 0; 
     height = 0; 
     width = 0; 
    } 
} 

顯然我改變某些部分的地圖類中不同的陣列,我想知道是否有任何更簡單的方法(在所有)保存塊對象的數組。

感謝您抽出寶貴時間提供幫助,如果您需要更具體的信息,請告訴我。

I.D.

回答

0

圖像不是可序列化的,所以當Blocks類被序列化時,您會收到NotSerializableException。 ImageIcon可以被序列化,因此將Image實例封裝在ImageIcons中可以解決這個問題。

public class Blocks implements Serializable 
{ 
    public boolean canWalk, onTop, itemTaken; 
    public ImageIcon img = null, imgBack = null; 
    public final ImageIcon (a ton of different images) 
    public String name, item, message, title; 
    public char initMap, initEx, initIt; 
    public int x, y, height, width; 

    public Blocks() 
    { 
     canWalk = true; 
     onTop = false; 
     itemTaken = false; 
     img = null; 
     // img = new ImageIcon(someImageInstance) 
     name = null; 
     item = null; 
     message = null; 
     x = 0; 
     y = 0; 
     height = 0; 
     width = 0; 
    } 
} 
+0

拋出相同的「NotSerializableException」 –

+0

我敢肯定,如果你有一個可序列化的類,並且該類的對象數組也是可序列化的。確保你使用了正確的Blocks對象。或者,您可以在Blocks類中重寫writeObject和readObject以將字段添加到要序列化的數組中。 – Vulcan

+0

@Vulcan你是對的(我測試它確保):數組是可序列化的,只要它們的所有元素都是可序列化的。 – Bohemian

0

只是讓一個類實現Serializable是不夠的:所有的字段都必須Serializable了。

您的Block類可能有問題。所有常見的java類都是Serializable,但Block也有Image類型的字段。如果Image不是Serializable,那麼嘗試序列化Block將拋出NotSerializableException

+0

謝謝,我會嘗試將它們更改爲ImageIcons(我很確定它是可序列化的)並查看需要我的位置。 –

相關問題