4

我正在尝试实现 Externalizable 接口以使用 LWUIT-IO 的存储来存储数据。这对于由字符串、布尔值和整数组成的简单对象非常有用。

但是,我有一个由这些类型组成的对象,而且还由上述 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 版本。

4

1 回答 1

2

您需要Util.register(...)在应用启动时将这些类注册为可外部化的。

此外,直接调用 externalize 是不正确的。您应该使用Util.writeObject/readObject编写另一个可外部化的对象(具有自己的版本号)。然后,您可以避免向量上的循环,这将是多余的,只需编写整个向量。

我还建议使用Util.readUTF/writeUTFwhich 支持空字符串。

作为旁注,我建议迁移到Codename one,因为 LWUIT 不再由任何人维护。此外,Steve Hannah 有一篇关于外部化的精彩文章是 Codename One,它与 LWUIT 非常相似(尽管它现在支持列表和地图):http ://www.shannah.ca/blog/?p=234

于 2013-07-27T11:02:27.200 回答