Для чего нужен @XStreamAlias в Java?

312
14 октября 2017, 17:35

Для чего в принципе нужен @XStreamAlias?

Answer 1

По умолчанию 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>
Answer 2

Используя 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>
READ ALSO
Retrofit + Jsoup = &ldquo;гремучая смесь&rdquo;. Реализация архитектуры

Retrofit + Jsoup = “гремучая смесь”. Реализация архитектуры

Всем привет! Имеется проект приложения в котором сетевые запросы выполняются с помощью Retrofit, а результат парсится через Jsoup(У сайта нет API, пришлось...

200
Методы just в RxJava

Методы just в RxJava

Просматривая исходники библиотеки ioreactivex

196
Приложение &ldquo;Тесты&rdquo; андроид

Приложение “Тесты” андроид

Есть LinkedHashMap, где ключ - это вопрос, а значение TreeMap, в котором ключи - это ответы, а значение bool(true ответ верный, false нет)

165