Простой XML на Android — класс MyArrayList расширяет ArrayList?

#java #android #xml

#java #Android #xml

Вопрос:

Я новичок в библиотеке simple xml. Мне это действительно нравится, но у меня проблема.

Вот мои классы (некоторый код был удален, чтобы сделать его более кратким):

 @Root
@ElementList
public class MyArrayList<E> extends ArrayList<E>{

public void ToXml() throws Exception{
            Serializer serializer = new Persister();
            File file = new File("somewhere in my file system");
            serializer.write(this, file);
    }
}
  

¬

 @Root
public abstract class MediaEntry implements Serializable {
            private static final long serialVersionUID = 1L;

            @Element
            public String Title;
            @Element
            public String Description;
            @Element
            public String Url;
            @Element
            public String LocalPath;

            public MediaEntry(String title, String description, 
                              String url, String localPath) {
                            Title= title;
                            Description= description;
                            Url= url;
                            LocalPath= localPath;
            }
}
  

¬

 public class VideoEntry extends MediaEntry {
            private static final long serialVersionUID = 1L;

            public VideoEntry(String title, String description, 
                              String url, String localPath) {

            super(title, description, url, localPath);
            }
}
  

Когда я создаю экземпляр MyArrayList, добавляю несколько видео-входов и вызываю ToXML, я получаю только пустой корневой ie.

 <MyArrayList />
  

Как мне это решить? Это как-то связано с тем, что MyArrayList является универсальным?

Ответ №1:

Список должен быть членом элемента (а не отдельного класса), чтобы получить желаемое поведение, вы можете установить встроенный список элементов, чтобы не было родительского элемента.

 @Root
public class MyArrayList<E> {   
    @ElementList(inline=true)
    ArrayList<E> list = new ArrayList<E>();

    public boolean add(E entry) {
        return list.add(entry);
    }

    public void ToXml() throws Exception {
        Serializer serializer = new Persister();
        File file = new File("somewhere in my file system");
        serializer.write(this, file);
    }
}
  

Просто подумал о другом решении, которое может быть даже лучше (у вас есть доступ ко всем функциям списка — но я не уверен, есть ли какие-либо побочные эффекты, поэтому я оставляю свое первоначальное решение)

 @Root
public class MyArrayList<E> extends ArrayList<E> {      
    @ElementList(inline=true)
    MyArrayList<E> list = this;

    public void ToXml() throws Exception {
        Serializer serializer = new Persister();
        File file = new File("somewhere in my file system");
        serializer.write(this, file);
    }
}
  

Для десериализации вам нужно объявить для SimpleXML, какой элемент используется для какого конструктора-параметра:

 @Root
public abstract class MediaEntry implements Serializable {
    private static final long serialVersionUID = 1L;

    @Element
    public String Title;
    @Element
    public String Description;
    @Element
    public String Url;
    @Element
    public String LocalPath;

    public MediaEntry(@Element(name = "Title") String title,
            @Element(name = "Description") String description,
            @Element(name = "Url") String url,
            @Element(name = "LocalPath") String localPath) {
        Title = title;
        Description = description;
        Url = url;
        LocalPath = localPath;
    }
}
  

Кстати, если вы только начинаете программировать Java, вы можете подумать о прочтении соглашений о коде Java — не рекомендуется начинать метод — и имена переменных с заглавной буквы (чтобы вы не привыкли к вредным привычкам ;-))

Комментарии:

1. Это здорово, но сейчас у меня проблемы с десериализацией… Можете ли вы предложить способ сделать это?

2. Это ошибка, которую я получаю org.simpleframework.xml.core. Исключение PersistenceException: конструктор не соответствует классу VideoEntry

3. @PhilippWendt Я пытаюсь использовать это, но когда я пытаюсь десериализовать, тип E всегда является объектом вместо реального типа списка. Что я могу делать не так?