Kurs Java Podstawy - rozszerzony

NotSerializableException

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.

notserializableexception projekt

Komentarze