2011-03-20 102 views
0

這是一個後續到Serializing a vector無法序列化一個ArrayList

我試圖實現加載和保存的遊戲我的工作。

我想保存Maze,其中包含ArrayListEntity以及其他屬性。

實體是Dragon,Hero和Item的超類。所有這三種類型都可以同時包含在載體中。

使用「自動」序列化機制(將implements Serializable添加到Maze)保存除ArrayList之外的所有屬性。

爲什麼會發生這種情況?

爲了完整起見,我的代碼如下。

package logic; 

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

public final class LoadAndSave { 
    public static final transient boolean available = false; 

    public static final boolean serialize(Object obj) { 

     // Write to disk with FileOutputStream 
     FileOutputStream saveFile; 
     try { 
      saveFile = new FileOutputStream("game.sav"); 
     } catch (FileNotFoundException e) { 
      return false; 
     } 

     // Write object with ObjectOutputStream 
     ObjectOutputStream objOut; 
     try { 
      objOut = new ObjectOutputStream(saveFile); 
     } catch (IOException e) { 
      // 
      return false; 
     } 

     // Write object out to disk 
     try { 
      objOut.writeObject(obj); 
     } catch (IOException e) { 
      return false; 
     } 

     return true; 
    } 

    public static final Object load() { 
     FileInputStream fileIn; 
     try { 
      fileIn = new FileInputStream("game.sav"); 
     } catch (FileNotFoundException e1) { 
      return null; 
     } 

     // Read object using ObjectInputStream 
     ObjectInputStream objIn; 
     try { 
      objIn = new ObjectInputStream(fileIn); 
     } catch (IOException e) { 
      return null; 
     } 

     // Read an object 
     Object obj; 
     try { 
      obj = objIn.readObject(); 
     } catch (IOException e) { 
      return null; 
     } catch (ClassNotFoundException e) { 
      return null; 
     } 

     return obj; 
    } 

} 
+2

愚蠢問題,但是你是否也添加了'implements Serializable'到'Entity'?爲了序列化列表,列表中的所有對象(以及所有對象中的所有非原始字段)必須實現「Serializable」。 – aroth 2011-03-20 10:43:03

回答

6

Entity也是可序列化的嗎? (你提到只有Maze是可序列化的)。

而且可以肯定的是,名單沒有被定義爲短暫靜態,否則將被序列化機制被跳過。

+1

解決了,不知道'static'做了那個... – 2011-03-20 10:53:10

+0

Ii是在Class定義中硬編碼的,所以它已經按照定義進行了序列化。當然,類定義版本必須與串行器和解串器相同 – 2011-04-26 13:42:47

+0

問題是List實例是可變的。你說的只適用於不可變的常量。 – Augusto 2011-04-26 13:56:43

1

您需要確保關閉流。您的加載代碼()可以簡化爲是這個樣子:

ObjectInputStream objIn = null; 
try { 
    objIn = new ObjectInputStream(new FileInputStream("game.sav")); 
    return objIn.readObject(); 
} catch (Exception exception) { 
    // Deal with errors 
    return null; 
} finally { 
    if (objIn != null) { 
     try { 
      objIn.close(); 
     } catch (Exception exception) {} 
    } 
} 

還原序列化()可以以類似的方式被改變。

+0

OOPS!我發佈了一箇舊版本的代碼。 – 2011-03-20 10:47:57

1

我檢查你有以下假設代碼:

class Entity implements Serializable {} 

和:

private char[][] mazeWalls = new char[0][0]; 

private Vector<Entity> entities = new Vector<Entity>(); 

...和它完美的作品,序列化和反序列化空Entity對象...