Przesłanie strumieniowe wyniku zapytania SQL zapisanego w ObservableList

0

Cześć, próbuję przesłać strumieniem wynik zapytania SQL który zapisuje pobrane wartości w ObservableList, niestety przy próbie odczytu obiektu przez klienta wyskakuje mi błąd:

writing aborted; java.io.NotSerializableException: com.sun.javafx.collections.ObservableListWrapper

Serwer:

private ObservableList<ObservableList> data;
    String SQL = "SELECT * FROM flights";

    private void CodePrintFlights(){

        data = FXCollections.observableArrayList();
        ResultSet rs;
        try {
            rs = con.createStatement().executeQuery(SQL);

            while (rs.next()) {
                //Iterate Row
                ObservableList row = FXCollections.observableArrayList();
                for (int i = 1; i <= rs.getMetaData().getColumnCount(); i++) {
                    //Iterate Column
                    row.add(rs.getString(i));
                }

                data.add(row);

            }

            try {

            ObjectOutputStream obj = new ObjectOutputStream(socket.getOutputStream());
                obj.writeObject(data);


            } catch (IOException e) {
                e.printStackTrace();
            }

        } catch (SQLException ex) {
            System.err.println(ex.getMessage());
        }

Metoda przesyłająca obiekty w klasie LoginController

ObservableList obj;

public ObservableList ServerDinObject2(){
        try {
            ObjectInputStream dinObj = new ObjectInputStream(s.getInputStream());
            obj = (ObservableList) dinObj.readObject();
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
        return obj;
    }

Klient:

LoginController obj = new LoginController();
        obj.ServerDout("PrintFlights");

        data = obj.ServerDinObject2();

        tblData.getItems().add(data);

Z góry dziękuję za pomoc :)

1

masz wszystko (dość) dobrze jasne.

Używasz ObjectInputStream więc odwołujesz sie nie do "jakiegoś" strumienia, a do javowskiej serializacji
Skoro tak, 100% hierarchii musi być Serialziable, a nie jest -> wyjątek

  1. Masz wyraźne powody, by użyć FXowej listy, a nie normalnej?
  2. masz wyraźne powodu użyć akurat serialziacji? Nie jest to solusion, pod którym by się każdy podpisał

PS wyjątek mówi o zapisie , Ty mówisz o odczycie.
PPS. architekt tego kodu to się w trumnie przewraca.

1

Dzięki za odpowiedź, pierwszy raz spotykam się z tym błędem, co ważniejsze przesyłam obiekt typu ArrayList do innej klasy bez takiego problemu. Jeśli jest na to inny sposób to prosiłbym o wyjaśnienie go, obsługa tego zapytania SQL to ostatni krok w moim projekcie na studia. — Tacoo 4 minuty temu

  1. Dokładnie, zwykłe listy są Serializable. Pachnie nawiasem mwóiać, jakbyś kodował stochastycznie, a nie miał jakiegoś planu

w ogółe kod jest godzien perełki.

 while (rs.next()) {
                //Iterate Row
                ObservableList row = FXCollections.observableArrayList();
                for (int i = 1; i <= rs.getMetaData().getColumnCount(); i++) {
                    //Iterate Column
                    row.add(rs.getString(i));
                }

Co poeta **naprawdę **chciał wyrazić?

  1. Przesyłanie między klasami tego samego projektu - ciężkawą technologią przeznaczoną do świata zewnętrznego - jest przynajmniej dziwne
1

Wiersz bym zaimplementował
Map<String,Object>

(tak naprawdę, to ja bym zaimplementował własną klasą do "wierszy" ale i tak zawierającą w/w Map)

Użyj po prostu ArrayList jak ci radzono. Widzę, że jest metoda żeby przerobić zwykłą listę na observable, więc to nie powinien być problem. — szatkus 6 minut temu

Nie jestem mistrzem świata FX, ale czy każdy kontekst "obserwowalności" jest tu potrzebny ???

O ile kolekcję wierszy to pewnie jest uzasadnione, bo wiąże się z dynamiką np Gridów, i na prawie każdy gridzie Javy/C# jest coś analogicznego, ale czy sam wiersz ???
Jak masz to @szatkus obcykane, może rozjaśnisz ...

0

Ok, przesyłam dane zwykłym ArrayList

Serwer:

String sql = "SELECT * FROM flights";

        try {
            preparedStatement = con.prepareStatement(sql);
            resultSet = preparedStatement.executeQuery();

            ArrayList arrayList = new ArrayList();

            while (resultSet.next()) {
                arrayList.add(resultSet.getInt(1));
                arrayList.add(resultSet.getString(2));
                arrayList.add(resultSet.getInt(3));
                arrayList.add(resultSet.getString(4));
                arrayList.add(resultSet.getString(5));
                arrayList.add(resultSet.getInt(6));
                arrayList.add(resultSet.getTime(7));
                arrayList.add(resultSet.getDate(8));
                arrayList.add(resultSet.getString(9));
                arrayList.add(resultSet.getString(10));

            }

            Object[] objArray = arrayList.toArray();

            FromServerObject(objArray);

Klient:

TableColumn t1 = new TableColumn("ID_Lotu");
       TableColumn t2 = new TableColumn("Samolot");
       TableColumn t3 = new TableColumn("Pas");
       TableColumn t4 = new TableColumn("Kierunek");
       TableColumn t5 = new TableColumn("Miasto");
       TableColumn t6 = new TableColumn("Wysokość");
       TableColumn t7 = new TableColumn("Godzina");
       TableColumn t8 = new TableColumn("Data");
       TableColumn t9 = new TableColumn("Czas_lotu");
       TableColumn t10 = new TableColumn("Czas_przylotu");
       tblData.getColumns().addAll(t1,t2,t3,t4,t5,t6,t7,t8,t9,t10);


       LoginController obj = new LoginController();
       obj.ServerDout("PrintFlights");

       Object[] arraylist = (Object[]) obj.ServerDinObject();

       for(int i=0; i < arraylist.length ; i++) {

           tblData.getItems().addAll(arraylist[i]);
           System.out.println(arraylist[i]);
       }

Funkcja przesyłająca obiekt do klienta

public Object ServerDinObject(){
        try {
            ObjectInputStream dinObj = new ObjectInputStream(s.getInputStream());
            obj2 = dinObj.readObject();
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
        return obj2;
    }

Wartości poprawnie wyświetlają się w konsoli, jednak tabela pozostaje pusta.

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