Внешняя реализация интерфейса для составного объекта в 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

Другие вопросы по тегам