NotSerializableException
Opis
NotSerializableException jest wyjątkiem z grupy wyjątków kontrolowanych (dziedziczących po Exception), więc konieczne jest jego obsłużenie w przypadku metod, które go deklarują. Możemy się z nim spotkać w sytuacji, gdy próbujemy dokonać serializacji obiektu, który reprezentuje klasę nieimplementującą interfejs Serializable.
Wyjątek znajduje się w pakiecie java.io więc pełna ścieżka do klasy, którą powinniśmy zaimportować to java.io.NotSerializableException.
Przykład
Na początek potrzebujemy klasę na podstawie której będziemy tworzyli obiekty, które następnie będziemy chcieli serializować i zapisać w pliku. W naszym przypadku będzie to klasa reprezentująca osobę (imię i nazwisko) w klasycznej formie JavaBeans.
Person.java
package pl.javastart.exception.notserializableexception;
public class Person {
private String firstName;
private String lastName;
public Person(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
NotSerializableExample.java
package pl.javastart.exception.notserializableexception;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
public class NotSerializableExample {
public static void main(String[] args) throws IOException {
Person person = new Person("Jan", "Kowalski");
FileOutputStream fos = new FileOutputStream("person.p");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(person);
oos.close();
}
}
W powyższym kodzie tworzymy obiekt typu Person. Definiujemy FileOutputStream, ponieważ obiekt ten będziemy chcieli zapisać w pliku person.p, ale musimy go opakować w ObjectOutputStream, ponieważ chcemy skorzystać z serializacji.
Przy próbie uruchomienia programu otrzymamy niestety wyjątek:
Exception in thread "main" java.io.NotSerializableException: pl.javastart.exception.notserializableexception.Person
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
at pl.javastart.exception.notserializableexception.NotSerializableExample.main(NotSerializableExample.java:12
Problem występuje przy wywoływaniu metody oos.write, ponieważ nasza klasa Person nie implementuje interfejsu Serializable. Metodę moglibyśmy opakować w blok try-catch jednak nie rozwiązuje to problemu a jedynie go ukrywa. Zamiast tego powinniśmy zrobić poprawkę w klasie Person:
package pl.javastart.exception.notserializableexception;
import java.io.Serializable;
public class Person implements Serializable {
//reszta kodu bez zmian
}
Po ponownym uruchomieniu programu zobaczymy, że w ramach projektu został utworzony plik person.p.
Dyskusja i komentarze
Masz pytania do tego wpisu? Może chcesz się podzielić spostrzeżeniami? Zapraszamy dyskusji na naszej grupie na Facebooku.