Znam podstawy API JAXB, ale utknąłem z czymś, co próbuję zrobić, i nie jestem pewien, czy jest to rzeczywiście możliwe. Szczegóły są następujące:Jak marnować/unmarshal obiektów Java z prywatnymi polami za pomocą JAXB
Mam klasy o nazwie Book z 2 publicznych instancji zmiennych typu String:
@XmlRootElement(name="book")
public class Book
{
public String title;
public String author;
public Book() {
}
}
mam inna klasa nazywa Bookshop z 1 publicznej instancji zmienna typu ArrayList:
@XmlRootElement(name="bookshop")
public class Bookshop
{
@XmlElementWrapper(name="book_list")
@XmlElement(name="book")
public ArrayList<Book> bookList;
public Bookshop() {
this.bookList = new ArrayList<>();
}
}
Uwaga: pakiet deklaracja i import są usuwane w celu zaoszczędzenia miejsca.
Te dwie klasy pracy i XML wyjście otrzymuję jest coś takiego:
<bookshop>
<book_list>
<book>
<title>Book 1</title>
<author>Author 1</author>
</book>
<book>
<title>Book 2</title>
<author>Author 2</author>
</book>
</book_list>
</bookshop>
O ile mi wiadomo, zmienne instancji muszą być deklarowane publicznej w celu jej klasa będzie serialisable. Innymi słowy zmienne instancji mogą być zadeklarowane jako prywatne, ale w tym przypadku potrzebne są akcesory i mutatory.
Nie lubię zadeklarować zmiennych instancji publicznych; Lubię używać akcesorów i mutatorów. Nawet wtedy chcę, aby niektóre z moich pól były tylko do odczytu, tj. Bez mutatora. Ale wydaje się, że JAXB wymaga zarówno akcesorów, jak i mutatorów dla każdego pola, które ma być marszałkiem/unmarshal. Zastanawiałem się, czy jest jakiś sposób obejścia tego?
nie działa jaxb używać refleksji? – Jayan
Patrząc na to pytanie http://stackoverflow.com/questions/3391256/how-java-jaxb-works, powinno to po prostu działać dobrze z prywatnymi polami – Jayan
Tak, używa refleksji; może muszę dodać atrybut XML do każdego pola instancji (publicznego, prywatnego lub chronionego) – temelm