Внешняя реализация интерфейса для составного объекта в Java. (LWUIT)
Я пытаюсь реализовать интерфейс Externalizable для хранения данных, используя хранилище LWUIT-IO. Это отлично работает для простых объектов, которые состоят из строк, логических и целых чисел.
Тем не менее, у меня есть объект, который состоит из этих типов, а также из вектора вышеупомянутого объекта Externalizable. Кажется, это портит процесс, и я ничего не получаю, когда пытаюсь извлечь объект из хранилища.
Я предположил, что это похоже на интерфейс 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, так как это версия LWUIT интерфейса Externalizable.
1 ответ
Вам нужно использовать Util.register(...)
зарегистрировать эти классы как externalizable при запуске вашего приложения.
Кроме того, обращение напрямую к внешнему виду не является правильным. Вы должны использовать Util.writeObject/readObject
написать другой выводимый объект (с собственным номером версии). Затем вы можете избежать цикла по вектору, который будет избыточным, и просто записать весь вектор.
Я бы также предложил использовать Util.readUTF/writeUTF
которые также поддерживают нулевые строки.
В качестве идентификатора я бы предложил перейти на кодовое имя, поскольку LWUIT больше не поддерживается никем. Кроме того, у Стива Ханны есть хорошая статья об экстернализации - Codename One, которая очень похожа на LWUIT (хотя теперь она поддерживает списки и карты): http://www.shannah.ca/blog/?p=234