#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 всегда является объектом вместо реального типа списка. Что я могу делать не так?