Для чего в принципе нужен @XStreamAlias
?
По умолчанию XStream при сериализации/десериализации объектов и спользует в качестве имени XML-узла полное имя класса.
class Foo {
public String name;
public Foo(String name) { this.name = name; }
}
Foo foo = new Foo("bar");
XStream xStream = new XStream();
System.out.println(xStream.toXML(foo));
Код выше выведет в консоль такой XML:
<com.example.Foo>
<name>bar</name>
</com.example.Foo>
в большинстве случае вы не захотите видеть полное имя класса в XML. Аннотация @XStreamAlias
позволяет задать псевдоним для класса:
@XStreamAlias("Foo")
class Foo {
public String name;
public Foo(String name) { this.name = name; }
}
Foo foo = new Foo("bar");
XStream xStream = new XStream();
xStream.processAnnotations(Foo.class);
System.out.println(xStream.toXML(foo));
Результат:
<Foo>
<name>bar</name>
</Foo>
Используя XStream
, XStreamAlias
указывает как сериализовать класс в xml.
@XStreamAlias("student")
class Student {
@XStreamAlias("name")
@XStreamAsAttribute
private String studentName;
@XStreamImplicit
private List<Note> notes = new ArrayList<Note>();
public Student(String name) {
this.studentName = name;
}
public void addNote(Note note) {
notes.add(note);
}
public String getName(){
return studentName;
}
public List<Note> getNotes(){
return notes;
}
@XStreamOmitField
private int type;
public int getType(){
return type;
}
public void setType(int type){
this.type = type;
}
}
@XStreamAlias("note")
class Note {
private String title;
private String description;
public Note(String title, String description) {
this.title = title;
this.description = description;
}
public String getTitle(){
return title;
}
public String getDescription(){
return description;
}
}
Тест:
public class XStreamTester {
public static void main(String args[]){
XStreamTester tester = new XStreamTester();
XStream xstream = new XStream(new StaxDriver());
Student student = tester.getStudentDetails();
xstream.processAnnotations(Student.class);
// пишем объект в xml
String xml = xstream.toXML(student);
}
private Student getStudentDetails(){
Student student = new Student("Vladislav");
student.addNote(new Note("first","Моя первая заметочка."));
student.addNote(new Note("second","Моя втораязаметочка."));
student.setType(1);
return student;
}
}
На выходе будет:
<?xml version="1.0" encoding="UTF-8"?>
<student name="Vladislav">
<note>
<title>first</title>
<description>Моя первая заметочка.</description>
</note>
<note>
<title>second</title>
<description>Моя втораязаметочка.</description>
</note>
</student>
Если, к примеру, у класса Student
не будет @XStreamAsAttribute
, то имя будет не аттрибутом, а отдельной нодой:
<?xml version="1.0" encoding="UTF-8"?>
<student>
<name>
Vladislav
</name>
<note>
<title>first</title>
<description>Моя первая заметочка.</description>
</note>
<note>
<title>second</title>
<description>Моя втораязаметочка.</description>
</note>
</student>
Если не будет @XStreamAlias("name")
, то будет использоваться имя переменной, а не name
:
<?xml version="1.0" encoding="UTF-8"?>
<student>
<studentName>
Vladislav
</studentName>
<note>
<title>first</title>
<description>Моя первая заметочка.</description>
</note>
<note>
<title>second</title>
<description>Моя втораязаметочка.</description>
</note>
</student>
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Всем привет! Имеется проект приложения в котором сетевые запросы выполняются с помощью Retrofit, а результат парсится через Jsoup(У сайта нет API, пришлось...
Есть LinkedHashMap, где ключ - это вопрос, а значение TreeMap, в котором ключи - это ответы, а значение bool(true ответ верный, false нет)