Problem z rzutowaniem

0

Odczytuje z pliku serlializowane dane zapisujac je od razu do pola obiektu i wszystko jest ok:

private void readFromFile(String filename) {
...
this.something = (Map<String, List<CustomClass>>) ois.readObject();
...
}

Chciałbym tę metodę uogólnić i rzutowanie robić przy wywołaniu metody:

private Object readFromFile(String filename) {
...
Object something = ois.readObject();
...
return something;
}

,czyli tak:

Map<String, List<CustomClass>> data = (Map<String, List<CustomClass>>) readFromFile("filename");

Jednak nie działa to dla serializowanych danych w kolekcji: Map<String, List<CustomClass>>, a działa dla kolekcji Map<String, CustomClass>.
Próbowałem też z metodami z typami generycznymi i to na różne sposoby. Nie działa, wychodzi "ClassCastException".

No właśnie, chciałem sprawdzić co dokładnie wyskakuje przy wyjątku i.... dokładnie ten sam kod na innym systemie działa.
Nic już nie rozumiem ;(

0

Dalej masz ten problem?
Jak tak to podeślij cały kod.

Pole something i metodę readObject(), chyba, że to jakieś zewnętrzne API?

0

Problem rozwiązałem. Tak mi się przynajmniej wydawało. Jednak teraz do mnie wrócił, gdy te same dane muszę deserializować z pliku w Androidzie.
Pierwotnie problemem okazało się być to, że by wszystko działało klasy których obiekty były zapisane w kolekcji musiały być dokładnie w takich samym pakietach, jak w momencie serializacji i zapisywania do pliku. Problemem było to, że zapis i odczyt były w innych aplikacjach i lokalizacje tych klas były inne. Problem zniknął gdy strukturę pakietów dla tych klas zrobiłem identyczną.
Teraz jednak w Androidzie mam narzuconą ścieżkę i strukturę pakietów dla danych i serializowanych klas. Przy próbie odczytu wyskakuje błąd.
Jak poprawnie serializować struktury typu ArrayList<CustomClass> by lokalizacja CustomClass w strukturze pakietów mogła być dowolna przy zapisie i odczycie ?

Kod działa, jeśli klasa Connection jest przy zapisie i odczycie w pakiecie z tą samą nazwą i ścieżką (czyli to poniżej nie działa):

Zapis:

import app.reader.Connection;

@Service
public class ConnectionScanService {

	private Map<String, List<Connection>> connectionsByOrigin = new HashMap<>();
	@Autowired
	private AirConnectionRepository airConnectionRepository;
	
	public void readConnectionsFromDatabase(){
		transferFromDatabase();
		try
	      {
	         FileOutputStream fileOut = new FileOutputStream("starAllianceConnections.cnt");
	         ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(fileOut));
	         out.writeObject(connectionsByOrigin);
	         out.close();
	         fileOut.close();
	      }catch(IOException i)
	      {
	    	  System.out.println("IOException (saving connectionsByOrigin): " + i);
	      }
		 System.out.println("Saved connectionsByOrigin to file");
	}
	
	private void transferFromDatabase(){
		Iterable<AirConnection> dataBaseAirConnection;
		dataBaseAirConnection = airConnectionRepository.findAll();
		for (AirConnection airConnection : dataBaseAirConnection) {
			AirportsData originAirport = airConnection.getAirportsData();
			String originCode = originAirport.getCityCode();
			Connection connection = new Connection(airConnection); 
			List<Connection> tempConnections = new LinkedList<>();
			if (connectionsByOrigin.containsKey(originCode)) {
				tempConnections = connectionsByOrigin.get(originCode);
				} 
			tempConnections.add(connection);
			connectionsByOrigin.put(originCode, tempConnections);
		}
	}
	
}

Odczyt:

import pl.robertsadlowski.awardroutes.model.Connection;
public class DataLoader {
		
	public Map<String, List<Connection>> getConnections() {
		Map<String, List<Connection>> connectionsByOrigin = (Map<String, List<Connection>>)loadFromFile("src/resources/star_alliance_connections.cnt");
		return connectionsByOrigin;
	}
	

	private Object loadFromFile(String filename) {
		File fileConnections = new File(filename);
		Object result = null;
		try {
			ObjectInputStream ois = new ObjectInputStream(
					new BufferedInputStream(
							new FileInputStream(fileConnections)));
			try {
				result =  ois.readObject();
			} catch (ClassNotFoundException i) {
				System.out.println(i);
			}
			ois.close();
		} catch (IOException i) {
			System.out.println(i);
		}
		return result;
	}

}
2

Taka tylko sugestia ode mnie -> jeśli to nie jest jakaś zabawkowa aplikacja to absolutnie zrezygnuj z serializacji obiektów w ten sposób na rzecz xmla albo jsona. Serio. Ten kod który masz teraz to jest proszenie się o bycie shackowanym :)

0

Aplikacja do zabawy. Ale dobrze wiedzieć, by tak nie robić. Dzięki.
Mam obawę, że JSON stworzy znacznie cieższy plik. Czy tak będzie?
Może dzięki temu uwolnię się od struktury pakietów dla zapisanych klas.

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