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):
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
Moduł matrices – aktualny stan projektu = 028;