2012-12-26 74 views
0

我有一個自定義類(下面的構造函數),我似乎無法序列化。java自定義類不可序列化

public ObjectNode(String name, int crackLevel,ArrayList<ObjectNode> filesOnComputer) 

每次我嘗試從對象節點的ArrayList序列這個類的一個對象,我得到一類轉換異常。 ArrayList中不能被強制轉換爲ObjectNode

代碼 - 全局變量:

ArrayList<ObjectNode>a=new ArrayList<ObjectNode>(); 
File file = new File("/mnt/sdcard/","cheesepuff.txt"); 

相關代碼:

 public void serializeFile() 
{  
    a.add(new ObjectNode("Level 1 Waterwall","ww1", 1, 5)); 
    try { 
     Log.i("AAA","before serialize: "+a.toString()); 
     FileOutputStream fos = new FileOutputStream(file); 
     ObjectOutputStream oos = new ObjectOutputStream(fos); 
     oos.writeObject(a); 
     oos.flush(); 
     oos.close(); 
     Log.i("AAA","finished serialize"); 
     } 
     catch(Exception e) { 
     Log.i("aaa","Exception during serialization: " + e); 
     System.exit(0); 
     } 
} 

public void deserializeFile() 
{ 
    try { 
     FileInputStream fis = new FileInputStream(file); 
     ObjectInputStream ois = new ObjectInputStream(fis); 
     ObjectNode obj=(ObjectNode)ois.readObject(); 
     Log.i("aaa","obj: "+obj.ts()); 
     //a.add((ObjectNode) ois.readObject()); 
     ois.close(); 
     Log.i("aaa","after serialize: " + a); 
     } 
     catch(Exception e) { 
     Log.i("aaa","Exception during deserialization: " + 
     e); 
     System.exit(0); 
     } 
     } 

是讓一切的字符串,以序列化,然後將我最好的選擇該字符串回到反序列化後我真正需要的東西?

+0

你的類是否實際實現了Serializable? – Woot4Moo

回答

2

您正在序列化a這是ArrayList<ObjectNode>

oos.writeObject(a); 

反序列化時,你回來正是這一點,但你嘗試將其保存爲ObjectNode

ObjectNode obj=(ObjectNode)ois.readObject(); 

你應該做

ArrayList<ObjectNode> obj = (ArrayList<ObjectNode>)ois.readObject(); 

UPDATE:或者,如PeterLawrey正確地指出,

List<ObjectNode> obj = (List<ObjectNode>) ois.readObject; 

(可能你必須重新定義aList<ObjectNode>,但這是另一件好事)。

+2

理想情況下,列表' –

+0

爲什麼在這種情況下使用列表更好,然後使用ArrayList ? – Rilcon42

+1

如果您使用更通用的定義(即,定義您需要的方法的超類,理想情況下是一個接口),那麼在需要時更改特定的實現將會更容易。例如,如果您將'a'定義爲'List ',您可以將其定義爲'ArrayList '或'Vector '(或您選擇的'List '的任何實現),只需更改您所在的行創建列表。在你原來的代碼中,改變實現意味着在使用它的任何地方改變它(更不用說其他可能使用它的代碼)。 – SJuan76

2

您正在編寫一個ArrayList,這意味着您在閱讀時必須將其強制轉換爲ArrayList(或更好的列表)。