Poprzedni artykułpreviousnextNastępny artykuł

Serializacja i deserializacja

Klasa zapisywanego obiektu musi implementować interfejs Serializable. W przykładach podajemy metodę serializującą pojedynczy obiekt i deserializującą pojedynczy obiekt, ale ponieważ mamy do czynienia ze strumieniami możemy oczywiście zapisać kolejno i odczytać kolejno dowolną liczbę obiektów.

Serializacja

Do serializacji macierzy jako obiektu możemy użyć metody serialize2 z klasy MatrixUtil:

 public static void serialize2(Matrix matrix, String path) {
   try {
        FileOutputStream fos = new FileOutputStream(path);
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(matrix);
        oos.flush();
        oos.close();
   } catch (IOException e) {
        e.printStackTrace();
   }
}

Powyższa metoda zapisuje cały obiekt Matrix. Znacznie prościej i ekonomiczniej jest (w tym przypadku) zapisać wyłącznie tablicę tego obiektu. Możemy to uczynić stosując metodę serialize z klasy MatrixUtil:

public static void serialize(double[][] array, String path) {
    try {
        FileOutputStream fos = new FileOutputStream(path);
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(array);
        oos.flush();
        oos.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

Przykład znajduje się w klasie Matrix041:

double[][] mat = {{9, 8, 7}, {6, 5, 4}, {3, 2, 1}};
MatrixUtil.serialize(mat, "matrices/assets/matrix1.ser");

Serializujemy tablicę do pliku. W folderze assets pojawi się nowy plik (jeśli się nie pojawi podświetl nazwę folderu i kliknij F5) (Rys. 279):

serializacja macierzy
Rys. 279. Serializacja macierzy

Deserializacja

Do deserializacji obiektu macierzy możemy użyć metody deserialize2 z klasy MatrixUtil:

 public static Matrix deserialize2(String path) {
        Matrix mat = null;
        try {
            FileInputStream fis = new FileInputStream(path);
            ObjectInputStream ois = new ObjectInputStream(fis);
            try {
                mat = (Matrix) ois.readObject();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
            ois.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return mat;
    }

Jeżeli serializowaliśmy wyłącznie tablicę do deserializacji możemy użyć metody serialize z klasy MatrixUtil:

 public static double[][] deserialize(String path) {
        double[][] array = null;
        try {
            FileInputStream fis = new FileInputStream(path);
            ObjectInputStream ois = new ObjectInputStream(fis);
            try {
                array = (double[][]) ois.readObject();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
            ois.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return array;
    }

Przykład w klasie Matrix042:

ic static void main(String[] args) {
        double[][] mat = MatrixUtil.deserialize("matrices/assets/matrix1.ser");
        Matrix matr = new Matrix(mat);
        matr.printToConsole();

W przykładzie deserializujemy tablicę serializowaną w poprzednim przykładzie. Po uruchomieniu kodu na tablicy otrzymmy:

9.0 8.0 7.0 
6.0 5.0 4.0 
3.0 2.0 1.0 

Pliki do ściągnięcia

matrices028.zip
Moduł matrices – aktualny stan projektu = 028;

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *