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

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.

1

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

0

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

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");
	}
	

}
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;
}
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;
    }
}

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;

:‑/ ?

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 :)

1

Prawdopodobnie miałeś nieprzekompilowane klasy.

0

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

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