Serializacja ObservableList

0

Witam, robię mały projekt w JavaFX.
Mam w nim ArrayList z obiektami mojej własnej klasy. Następnie tę listę wkładam do ObservableList, gdyż potrzebuję ją w ComboBoxie, a w nim może być tylko ObservableList.

Problemem jednak jest zapisanie do pliku tej ObservableList.

Wywala błędy zarówno przy standardowej serializacji:

			ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(plik_aktualny));
			out.writeObject(lista);
			out.close();

jak i przy próbie serializacji za pomocą Gsona:

	public void zapiszPlik() throws JsonIOException, IOException {
		
		Writer writer1 = new FileWriter(aktualnyPlik);
	
		Gson gson = new Gson();
		gson.toJson(lista, writer1);
		writer1.close();
	}

	public void wczytajPlik() throws JsonSyntaxException, JsonIOException, FileNotFoundException {

		Reader reader1 = new FileReader(aktualnyPlik);
		Gson gson = new Gson();
		<u>ObservableList<Słowo> lista = gson.fromJson(reader1, ObservableList.class);</u>
	}

Serializacja odbywa się w sumie prawidłowo, ale gdy próbuję dokonać deserializacji, to wyskakuje błąd (podkreślona linia w kodzie):
Caused by: java.lang.ClassCastException: Cannot cast java.util.ArrayList to javafx.collections.ObservableList

Co z tym zrobić ma ktoś pomysł?

Z góry dzięki za pomoc.

0

Ok, dzięki. Z ObservableList chyba nie przejdzie.

Próbuję teraz zwykłą ArrayList serializowac/deserializować Jsonem, jednak znowu bład :/
tym razem:
Caused by: java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to main.Słowo

	public void wczytajPlik() throws JsonSyntaxException, JsonIOException, IOException {
		
           Reader reader1 = new FileReader(aktualnyPlik);
		Gson gson = new Gson();
		listaArray = (List<Słowo>) gson.fromJson(reader1, listaArray.getClass());
		reader1.close();
	}

Tak to wygląda, jakby lista wczytana z pliku .json, nie był tego samego typu, co wcześniej.

1

Możesz podać kod klasy slowo?

0

package main;

public class Słowo {

	private String ang, pl;



	public Słowo(String ang) {
		this.ang = ang;

	}

	public Słowo(String ang, String pl) {
		this.pl = pl;
		this.ang = ang;

	}

	public void setANG(String ang) {
		this.ang = ang;
	}

	public void setPL(String pl) {
		this.pl = pl;
	}

	public String getANG() {
		return this.ang;
	}

	public String getPL() {
		return this.pl;
	}

	public String toString() {
		return this.ang + " : " + this.pl;
	}

}

Błąd wyskakuje w linii, gdzie jest wywołanie metody z tej klasy: listaArray.get(0).getANG()); , już po wykonaniu deserializacji.

1

Settery i gettery masz niezgodnie z konwekcją prawdopodobnie i to może być jedna z przyczyn. Jak je tworzyłeś? Z jakiego IDE korzystasz?

0

Korzystam z eclipse'a.

Pisałem je ręcznie.

Tylko co jest w nich niezgodnego z konwencją? Napisane są tak jak wszystkie z którymi się spotkałem w książkach czy tutorialach.

0

Nie szkoda ci czasu na ręczne pisanie? Jak będziesz miał 10 pól to też z łapy będziesz pisać?
Wygeneruj z IDE i sugeruję zmienić Eclipse na IntelliJ. Myślałem że to powoduje błąd ale widzę że GSON nie korzysta chyba z getterów i setterów, zobacze wieczorem :D

0

Wiem, że wygodniej wygenerować sobie, zamiast klepać na klawiaturze, ale jak pisałem tę klasę, to jeszcze o tym chyba nawet nie wiedziałem :)

No, ale skoro dobrze zapisuje plik, to gettery są okay. A settery jakoś się wielce nie różnią.

Eh, z użyciem Jackson też nie idzie:

	public void zapiszPlik() throws JsonGenerationException, JsonMappingException, IOException  {

	mapper.writeValue(new File("file111.json"), listaArray);

	}

	public void wczytajPlik() throws JsonParseException, JsonMappingException, IOException   {
		
		 ObjectMapper mapper = new ObjectMapper();
		 List<Słowo> listaArray = mapper.readValue("file111.json", new TypeReference<List<Słowo>>(){});
	}

Caused by: com.fasterxml.jackson.core.JsonParseException: Unrecognized token 'file111': was expecting 'null', 'true', 'false' or NaN
at [Source: file111.json; line: 1, column: 8]

Problem jest w tej linii:

List<Słowo> listaArray = mapper.readValue("file111.json", new TypeReference<List<Słowo>>(){});
0

Ej ty używasz polskich znaków w kodzie?

0

No tak.

Polacy nie gęsi, swój język mają.

0

Nawet jak chcę głupiego Stringa zdeserializować, to też wyskakuje ten błąd


String tekst;

	public void zapiszPlik() throws JsonGenerationException, JsonMappingException, IOException  {

		tekst  = "przykladowyyyy tekstttt";
		mapper.writeValue(new File("file111.json"), tekst;
	}

	public void wczytajPlik() throws JsonParseException, JsonMappingException, IOException   {

		tekst = mapper.readValue("file111.json", String.class);

	}

Caused by: com.fasterxml.jackson.core.JsonParseException: Unrecognized token 'file111': was expecting 'null', 'true', 'false' or NaN
at [Source: file111.json; line: 1, column: 8]

0

Jak piszesz kod z polskimi znakami to już nic nie mówię. W ogóle po polsku programować to zło, ale np. nazwy klas z polskimi znakami to jest w ogóle wymysł szatana, nie sądze żeby to było do końca bezpieczne

0

Po pierwsze powinieneś pisać nazwy w języku angielskim. Jak już bardzo chcesz po polsku to chociaż nie używaj polskich liter :P

Tu masz przykład zapisu ArrayList bo jak dobrze zrozumiałem z tym masz teraz problem. Klasa Word to Twoja klasa Słowo.

ObjectMapper map = new ObjectMapper();
		ArrayList<Word> list = new ArrayList<Word>();
		list.add(new Word("pies", "dog"));
		list.add(new Word("kot", "cat"));
		list.add(new Word("koń", "horse"));

		FileWriter fileWriter;
		try {
			fileWriter = new FileWriter("file.json");
			map.writeValue(fileWriter, list);
			fileWriter.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

Tu odczyt

FileReader fileReader;
		try {
			fileReader = new FileReader("file.json");
		ArrayList<Word> lista = map.readValue(fileReader, map.getTypeFactory().constructCollectionType(List.class, Word.class) );
			
			System.out.println(lista);
			fileReader.close();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

Dodatkowo polecam jednak używać GSON. Jest on moim zdaniem "przyjemniejszy" w obsłudze i w Internecie znajdziesz dużo przykładów jak go używać.

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