2013-07-26 61 views
4

我想實現Externalizable接口來存儲使用LWUIT-IO的存儲數據。這適用於由字符串,布爾值和整數組成的簡單對象。Java中編寫對象的Externalizable接口implmentation。 (LWUIT)

但是,我有一個由這些類型組成的對象,但也包含上述Externalizable對象的Vector。這似乎弄亂了這個過程,當我嘗試從存儲中檢索對象時,我什麼也得不到。

我認爲它就像Serializable接口,並且主對象內的Externalizable對象被自動處理。我不確定這是否屬實,或者它爲什麼失敗。

對象內部的對象是:

public class Song implements Externalizable{ 

    String name = "examplesongname"; 

    public void externalize(DataOutputStream out) throws IOException { 
     out.writeUTF(name); 
    } 

    public void internalize(int version, DataInputStream in) throws IOException { 
     name = in.readUTF(); 
    } 

    public String getObjectId() { 
     return "pat.objects.Song"; 
    } 

    public int getVersion() { 
     return 1; 
    } 
} 

包含的對象如下:

public class Playlist implements Externalizable{ 
    String name = "exampleplaylistname"; 
    Vector songs = new Vector(); 

    public void externalize(DataOutputStream out) throws IOException {   
     out.writeUTF(name); 
     out.write(songs.size()); 
     Enumeration allItems = songs.elements(); 

     while(allItems.hasMoreElements()){ 
       Externalizable nextItem = (Externalizable) allItems.nextElement(); 
       nextItem.externalize(out); 
     } 
    } 

    public void internalize(int version, DataInputStream in) throws IOException { 
     name = in.readUTF(); 

     int size = in.readInt(); 
     songs= new Vector(); 
     for(int currentIndex = 0; currentIndex < size; currentIndex++){ 
      Object nextItem = new Object(); 
      ((Externalizable)nextItem).internalize(version, in); 
       songs.addElement(nextItem); 
     } 
    } 
    } 

    public String getObjectId() { 
     return "pat.objects.Playlist"; 
    } 

    public int getVersion() { 
     return 1; 
    } 
} 

我在做什麼錯誤或丟失的是正在播放列表(包含對象)不存儲,而如果我嘗試存儲第一個自己的作品?

請注意,重寫方法與普通Java不同,因爲這是Externalizable接口的LWUIT版本。

回答

2

當您的應用程序啓動時,您需要使用Util.register(...)將這些類註冊爲可外部化的。

此外,直接調用外部調用是不正確的。您應該使用Util.writeObject/readObject編寫另一個可外部化對象(使用其自己的版本號)。然後你可以避免遍歷向量的循環,這將是多餘的,只需寫出整個向量。

我也建議使用支持空字符串的Util.readUTF/writeUTF

作爲一個旁註,我建議遷移到Codename one,因爲LWUIT不再被任何人維護。另外史蒂夫漢納有一個很好的外部寫法是Codename One這是非常類似於LWUIT(雖然它現在支持列表和地圖):http://www.shannah.ca/blog/?p=234

+0

謝謝您的回覆!關於遷移到Codename一,我正在編寫的應用程序針對諾基亞Asha手機,所以我使用諾基亞版本的LWUIT http://developer.nokia.com/Resources/Library/LWUIT/#!lwuit- for-nokia-asha-software-platform.html爲本機外觀。 Codename也可以達到這個效果嗎? – Pat

+0

是的,它支持Asha設備和主題。 –

+0

本地諾基亞用戶界面組件如類別欄和操作如何? http://developer.nokia.com/Resources/Library/LWUIT/#!lwuit-for-nokia-asha-software-platform/ux-guidelines/category-bar.html – Pat