
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;
