Java JAXB

0

Cześć,

chciałbym najpierw przedstawić Wam strukturę mojego programu, a następnie problem z jakim się spotkałem. Otóż stworzyłem w javie grę w kółko i krzyżyk działającej na serwerze. Chciałbym móc zapisać stan gry za pomocą JAXB do XML, jednak spotkałem się z paroma problemami.

W klasie serwera chce zserializowac obiekt klasy Gra, za pomocą JAXB. Zmienną klasy Gra, która mnie interesuje jest tablica pól, aktualnie toczonej gry. Dodam jeszcze, że w klasie Gra, znajduje się klasa Gracz, która zajmuje się ruchami poszczególnego gracza na serwerze. Wracając do tablicy pól. Pola planszy są zapisane w postaci Gracz [] plansza={}; czyli tablica jest typu Gracz. Gdy próbuję skorzystać z funkcji marshal wyskakuje mi m.in błąd mówiący o tym, że jaxb nie może zapisać zmiennej tego typu. Czytałem że warto wtedy skorzystać z adaptera, jednak nie rozumiem do końca, jak ma on działać.

Jeśli jest ktoś kto, mimo wytłumaczenia na miernym poziomie, zrozumiał mój problem to byłybym bardzo wdzięczny za jakąś wskazówkę

0

JAXB do takiego problemu to jakieś nieporozumienie. Chyba, że chodzi o przećwiczenie JAXB? Pokaż kod jak robisz tę serializację.

0

W ten sposób serializuje się DTO / struktury danych / klasy które mają tylko "dane", a nie obiekty domenowe! Dodatkowo JAXB podobnie jak Jackson i podobne biblioteki może potrzebować takich rzeczy jak:

  • bezargumentowy konstruktor
  • gettery/settery dla pól
0
public class Serwer {

    public static void main(String[] args) throws IOException, JAXBException, InterruptedException {
	Gra gra = new Gra();
	Gra.Gracz[] plansza = gra.getPlansza();
        gra.pokazPlansze(plansza);
        Gra gra2 = new Gra();
	gra2.setPlansza(plansza);
	File f = new File("serwer.xml");
        JAXBContext ctx = JAXBContext.newInstance(Gra.class);
        Marshaller marshaller = ctx.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
	marshaller.marshal(gra2,System.out);
	marshaller.marshal(gra2,f);
	}
}

@XmlRootElement(name="gra")
@XmlAccessorType(XmlAccessType.NONE)
class Gra {
	private Gracz[] plansza = {
            null, null, null,
            null, null, null,
            null, null, null};
	public Gra() {}
   	public Gra(Gracz[] plansza) {this.plansza=plansza;}
	public Gracz[] getPlansza() {
    	return this.plansza;
    	}
    	@XmlElement
    	public void setPlansza(Gracz[] plansza) {
    	 this.plansza=plansza; //set psuje, mozna odkomentowac i zobaczyc
   	 }
}

Wywala taki blad: Exception in thread "main" com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 2 counts of IllegalAnnotationExceptions
Gra$Gracz is a non-static inner class, and JAXB can't handle those.

0
  1. To jest jakiś dramat ten kod
  2. Masz przecież jasno napisane, że nie lubi non static inner class. Zrób z tego Gracz nową publiczną klasę i tyle.

1 użytkowników online, w tym zalogowanych: 0, gości: 1