Zielony Smok - logo witryny

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

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