Jak wykonać serializację obiektu na linuksie?? Błąd sun.nio.fs.UnixPath

Odpowiedz Nowy wątek
2018-01-16 18:04

Rejestracja: 2 lata temu

Ostatnio: 1 rok temu

0

Witam, chcę zapisać obiekt do pliku. Oczywiście klasa z której pochodzi obiekt implementuje interfejs Serializable.

import java.io.*;
import java.io.Serializable;

public class ZapisDoPliku {

    // deserialize to Object from given file
    public static Object deserialize(String nowezamowienie) throws IOException,
            ClassNotFoundException {

        FileInputStream fis = new FileInputStream(nowezamowienie);
        ObjectInputStream ois = new ObjectInputStream(fis);
        Object obj = ois.readObject();
        ois.close();
        return obj;
    }

    // serialize the given object and save it to file
    public static void serialize(Zamowienie z, String jakisplik)
            throws IOException {

        FileOutputStream fos = new FileOutputStream(jakisplik);
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(z);

        fos.close();
    }

}

Wywołanie:

ZapisDoPliku.serialize(z, "/home/pawel/IdeaProjects/proj/src/main/java/pl/kurs/zadania/zadanie14/jakisplik");

Przy

oos.writeObject(z);

Dostaję:

Exception in thread "main" java.io.NotSerializableException: sun.nio.fs.UnixPath

Ktoś ma jakiś pomysł? Na macu i windowsie działa poprawnie.

Pozostało 580 znaków

2018-01-16 18:09

Rejestracja: 8 lat temu

Ostatnio: 10 godzin temu

1

screenshot-www.google.pl-2018-01-16-18-08-31.png


Szacuje się, że w Polsce brakuje 50 tys. programistów

Pozostało 580 znaków

2018-01-16 18:11

Rejestracja: 2 lata temu

Ostatnio: 1 rok temu

0

Tam jest tylko:
"Serialize it as a String instead of a Path."

Czego w tym zdaniu nie rozumiesz? - vpiotr 2018-01-16 18:12
Wydawało mi się że właśnie to zastosowałem w kodzie powyżej i dalej to samo. - Sadek__pp 2018-01-16 18:14
Pokaż klasę Zamowienie - vpiotr 2018-01-16 18:17

Pozostało 580 znaków

2018-01-16 18:19

Rejestracja: 2 lata temu

Ostatnio: 1 rok temu

0
package pl.kurs.zadania.zadanie14;
import java.io.IOException;
import java.io.Serializable;
import java.nio.file.Path;
import java.nio.file.Paths;

public class Zamowienie implements Serializable  {

    private Pozycja pozycje[];

    static int ileDodanych = 0; // liczba pozycji w zam�wieniu
    int maksRozmiar; // maksymalna liczba pozycji w zam�wieniu
    Pozycja temp = new Pozycja();

    // konstruktor bezparametrowy � maksRozmiar ustalany na warto�� 10
    public Zamowienie() {
        maksRozmiar = 10;
        pozycje = new Pozycja[maksRozmiar];

    }

    // konstruktor z parametrem okre�laj�cym maksymaln� liczb� pozycji w zam�wieniu

    public Zamowienie(int maksRozmiar) {
        this.maksRozmiar = maksRozmiar;
        pozycje = new Pozycja[maksRozmiar];

    }

    // dodaje podan� pozycj� do zam�wienia ??????????

    public double obliczWartosc(double cena, int iloscSztuk) {

        double wartosc = 0;
        if (iloscSztuk < 5) {
            wartosc = cena * iloscSztuk;
        } else wartosc = a.obliczWartoscZRabatem(cena, iloscSztuk);

        return wartosc;
    }

    @Override
    public String toString() {

        StringBuffer stringBuffer = new StringBuffer();

        for (int i = 0; i < ileDodanych; i++) {
            stringBuffer.append(pozycje[i].toString());
            stringBuffer.append("\n");
        }

        return stringBuffer.toString();
    }

    void dodajPozycje(Pozycja p) {
        //tutaj juz obiekt p jest podwojony

        if (ileDodanych < maksRozmiar) {

            pozycje[ileDodanych] = p;
            ileDodanych++;

        } else {
            System.out.println("Nie mozna dodac: " + p);
        }
        //System.out.println("Nazwa dodawanego produktu: "+p.getNazwaTowaru());
        //System.out.println("Nazwa sprawdzanego produktu: "+pozycje[ileDodanych-2].getNazwaTowaru());
        if (ileDodanych > 1) {
            boolean sprawdzenie = p.getNazwaTowaru().equals(pozycje[ileDodanych - 2].getNazwaTowaru());

            if (sprawdzenie == true) {
                //int wynik = p.getIleSztuk() + pozycje[ileDodanych-1].getIleSztuk();
                int wynik = 1 + pozycje[ileDodanych - 1].getIleSztuk();
                pozycje[ileDodanych - 2].setIleSztuk(wynik);
                ileDodanych = ileDodanych - 1;
                System.out.println("Dodano powtarzajaca sie pozycje: " + p.getNazwaTowaru());

                //obiekt p jako parametr metody dodaj ma tyle sztuk ile w tabeli, a nie tyle co jako p1,p2...
            }
        }
        System.out.println("Dodano pozycję: " + p.getNazwaTowaru() + " w ilosci: " + p.getIleSztuk());
    }

    void usunPozycje(int indeks) {

        for (int i = indeks; i < ileDodanych; i++) {

            pozycje[i] = pozycje[i + 1];

        }
        ileDodanych = ileDodanych - 1;
    }

    void podsumowanie() {
        double suma = 0;
        double cenajedn;
        int iloscjedn;
        double sumajedn;
        for (int i = 0; i < ileDodanych; i++) {
            cenajedn = pozycje[i].getCena();
            iloscjedn = pozycje[i].getIleSztuk();
            if (pozycje[i].getIleSztuk() < 5) {
                sumajedn = cenajedn * iloscjedn;
                suma = suma + sumajedn;
            } else {

                sumajedn = a.obliczWartoscZRabatem(pozycje[i].getCena(), pozycje[i].getIleSztuk());
                suma = suma + sumajedn;
            }

        }
        System.out.println("Razem: " + suma + " zl");
    }

}
Teraz to by się przydało jeszcze zobaczyć klasę "Pozycja". - vpiotr 2018-01-16 18:22

Pozostało 580 znaków

2018-01-16 18:24

Rejestracja: 3 lata temu

Ostatnio: 3 dni temu

Lokalizacja: Siemianowice Śląskie

0

Oczywiście klasa z której pochodzi obiekt implementuje interfejs Serializable.

Ale po co ta zagadka? Normalnie pokazałbyś kod tej klasy, bo to pewnie jest kluczowe. Czy ta klasa też się nie serializuje:

public class Zamowienie
{
  String s;
}

Przeważnie ignoruję niezarejestrowanych użytkowników.
Sorry, to nie miała być zagadka. Po prostu pierwszym błędem które wskazują poradniki jest brak implementacji tego interfejsu - Sadek__pp 2018-01-16 18:40

Pozostało 580 znaków

2018-01-16 18:38

Rejestracja: 2 lata temu

Ostatnio: 1 rok temu

0

Ok klasa pozycja:

import java.io.Serializable;

public class Pozycja  implements Serializable {
    private String nazwaTowaru;
    private int ileSztuk;
    private double cena;

    public Pozycja(String nazwaTowaru, int ileSztuk, double cena) {

        this.ileSztuk = ileSztuk;
        this.nazwaTowaru = nazwaTowaru;
        this.cena = cena;
    }

    public Pozycja() {

    }

    public int getIleSztuk() {

        return ileSztuk;
    }

    public String getNazwaTowaru() {

        return nazwaTowaru;
    }

    public double getCena() {

        return cena;
    }

    public void setIleSztuk(int ileSztuk) {
        this.ileSztuk = ileSztuk;
    }

    public void setNazwaTowaru(String nazwaTowaru) {
        this.nazwaTowaru = nazwaTowaru;
    }

    public void setCena(double cena) {
        this.cena = cena;
    }

    public double obliczWartosc(double cena, int iloscSztuk) {
        //zwracaj�c� warto�� pozycji zam�wienia,

        double wartosc = cena * iloscSztuk;

        return wartosc;

    }    

    @Override
    public String toString() {
      String lancuch = "";
        if (ileSztuk<5) {
            lancuch = nazwaTowaru + "       " + cena + " zl       " + ileSztuk + " szt.      " + obliczWartosc(getCena(), getIleSztuk()) + "zl";
        }
        else {
            lancuch = nazwaTowaru + "       " + cena + " zl       " + ileSztuk + " szt.      " + obliczWartoscZRabatem(getCena(), getIleSztuk()) + "zl";
            double rabat = obliczWartosc(getCena(), getIleSztuk()) - obliczWartoscZRabatem(getCena(), getIleSztuk());
            System.out.println("naliczono rabat w wysokosci: " + rabat + "zł");
        }
        return lancuch;

    }

    double obliczWartoscZRabatem(double cena, int ileSztuk){
        double wartoscZRabatem=0;
        // 5–10 szt. rabat 5%

        if (ileSztuk>=5 && ileSztuk<=10)
        {
           double wartoscZRabatem1 =  0.95* obliczWartosc(cena,ileSztuk );
           wartoscZRabatem = wartoscZRabatem1;
        }
      else {

            if (ileSztuk> 10 && ileSztuk <= 20) {
                double wartoscZRabatem2 = 0.90 * obliczWartosc(cena, ileSztuk);
                wartoscZRabatem = wartoscZRabatem2;
            } else {

                if (ileSztuk > 20) {
                    double wartoscZRabatem3 = 0.85 * obliczWartosc(cena, ileSztuk);
                    wartoscZRabatem = wartoscZRabatem3;
                }

            }
        }

        return wartoscZRabatem;
    }
}

Pozostało 580 znaków

2018-01-16 19:09

Rejestracja: 3 lata temu

Ostatnio: 7 godzin temu

Lokalizacja: U krasnoludów - pod górą

4

Podejrzewam, że nas oszukujesz i nie skopiowałeś dokładnie tego kodu, kóry Ci nie działa.
Albowiem -

  1. podany kod nie powinien powodować tego błedu.
  2. Na co Ci te importy w Zamówienie:

    import java.nio.file.Path;
    import java.nio.file.Paths;

    :‑/ ?


jeden i pół terabajta powinno wystarczyć każdemu
edytowany 2x, ostatnio: jarekr000000, 2018-01-16 19:11
Dzięki, działa - Sadek__pp 2018-01-16 19:23

Pozostało 580 znaków

2018-01-16 19:20

Rejestracja: 2 lata temu

Ostatnio: 1 rok temu

0

Importy pozostały bo próbowałem wcześniej innych opcji zapisu do pliku.

Kod działa, ale na OSX i windows.

Wkleiłem tutaj ten kod albowiem ( :) ) nie powinien powodować błędu a powoduje tylko na linuksie.

A usunięcie tych importów rozwiązało problem :)

edytowany 1x, ostatnio: Sadek__pp, 2018-01-16 19:22

Pozostało 580 znaków

2018-01-16 19:23

Rejestracja: 8 lat temu

Ostatnio: 10 godzin temu

Prawdopodobnie miałeś nieprzekompilowane klasy.


Szacuje się, że w Polsce brakuje 50 tys. programistów

Pozostało 580 znaków

2018-01-16 21:54

Rejestracja: 3 lata temu

Ostatnio: 3 dni temu

Lokalizacja: Siemianowice Śląskie

0

To nie Linux winny, a Twój stary kod, którego nikt nie widział.


Przeważnie ignoruję niezarejestrowanych użytkowników.

Pozostało 580 znaków

Odpowiedz

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