我正在尝试使用LWUIT-IO的存储实现Externalizable接口来存储数据.这对于由字符串,布尔值和整数组成的简单对象非常有用.
但是,我有一个由这些类型组成的对象,但也有一个上面提到的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版本.
最佳答案 当您的应用启动时,您需要使用Util.register(…)将这些类注册为可外部化.
直接调用外部化也是不正确的.您应该使用Util.writeObject / readObject来编写另一个可外部化的对象(具有自己的版本号).然后,您可以避免向量上的循环,这将是多余的,只需写入整个向量.
我还建议使用支持空字符串的Util.readUTF / writeUTF.
作为旁注,我建议迁移到Codename one,因为LWUIT不再由任何人维护.此外,Steve Hannah对外化的一个很好的写法是Codename One,它与LWUIT非常相似(尽管它现在支持列表和地图):http://www.shannah.ca/blog/?p=234