Java.IO.NotSerializableException in Java behoben

Mehvish Ashiq 12 Oktober 2023
  1. Reproduzieren Sie die java.io.NotSerializableException in Java
  2. Ursachen der java.io.NotSerializableException in Java
  3. Beheben Sie die java.io.NotSerializableException in Java
Java.IO.NotSerializableException in Java behoben

Heute werden wir die java.io.NotSerializableException reproduzieren, während wir ein Programm in Java schreiben. Wir werden auch verstehen, was dieser Fehler bedeutet, was zu seinen Ursachen und Lösungen führt.

Reproduzieren Sie die java.io.NotSerializableException in Java

Beispielcode (Student.java-Datei):

package com.serializertest;

class Student {
  private String studentId;

  public String getId() {
    return studentId;
  }
  public void setId(String id) {
    this.studentId = id;
  }
}

Die Klasse Student ist eine Hilfsklasse mit einer Mitgliedsvariablen namens studentId. Es hat auch Mitgliedsmethoden namens getId() und setId(), um die id eines Schülers zu erhalten und festzulegen.

Beispielcode (Datei SerializerTest.java):

package com.serializertest;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

public class SerializerTest {
  public static void main(String[] args) throws IOException {
    FileOutputStream fileOutputStream = new FileOutputStream("students.txt");
    ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);

    Student student = new Student();
    student.setId("0001");

    objectOutputStream.writeObject(student);
    objectOutputStream.close();
  }
}

Der SerializerTest ist unsere Hauptklasse, in der wir die Treibermethode main() haben. Innerhalb von main() erstellen wir eine Instanz der Klasse FileOutputStream, um eine Datei zu erstellen.

Auf ähnliche Weise erstellen wir eine weitere Instanz der Klasse ObjectOutputStream.

Dann erstellen wir ein Objekt der Klasse Student und rufen seine Methode setId() auf, indem wir ein String-Argument übergeben. Als nächstes verwenden wir das Objekt der Klasse ObjectOutputStream, um ein Objekt in den Stream zu schreiben.

Dafür verwenden wir die Methode writeObject().

Danach schließen wir den Stream mit der Methode close() und führen das Programm aus, aber es gibt uns die folgende Ausnahme in der Ausgabekonsole des Programms.

Exception in thread "main" java.io.NotSerializableException: com.serializertest.Student

Warum sind wir damit konfrontiert? Lassen Sie uns den Fehler verstehen, um seine Ursachen unten herauszufinden.

Ursachen der java.io.NotSerializableException in Java

Es ist wichtig, NotSerializableException und Serialization zu verstehen, um die Ursachen zu finden.

Serialisierung ist ein Mechanismus in der Java-Programmierung, den wir verwenden, um den Zustand eines Objekts in den Bytestrom zu schreiben. Im Gegensatz dazu wird die umgekehrte Operation davon “Deserialisierung” genannt.

Die Serialisierung und Deserialisierung sind plattformunabhängig. Das bedeutet, dass beide Prozesse auf unterschiedlichen Plattformen ausgeführt werden können.

Wir verwenden Serialisierung in Remote Method Invocation (RMI) und Enterprise Java Beans (EJB). Es wird auch in Java Persistence API (JPA), Hibernate usw. verwendet.

Die NotSerializableException ist eine Ausnahme, die die Klasse ObjectStreamException erweitert, die als Oberklasse aller anderen Ausnahmen definiert ist, die für die Object Stream-Klassen spezifisch sind.

Zusätzlich erweitert die ObjectStreamException die IOException, die weiter signalisiert, dass eine I/O-Exception generiert wurde.

Nun kennen wir die Serialization und NotSerializableException in Java. Diese Diskussion führt uns dazu, die Gründe für NotSerializableException in Java zu entdecken.

  1. Die NotSerializableException tritt auf, wenn eine Instanz einer Klasse eine Serializable-Schnittstelle implementieren muss.
  2. Wir erhalten diese Ausnahme auch entweder von einer Instanz einer Klasse oder der Serialisierungslaufzeit. Denken Sie daran, dass das Argument von NotSerializableException ein Name einer Klasse ist.
  3. Gemäß der Dokumentation muss der vollständige Objektgraph serialisierbar sein. Die NotSerializableException tritt auch auf, wenn beim Versuch, eine Instanz einer Klasse zu serialisieren, mindestens eines der Felder die Schnittstelle Serializable nicht implementiert.

Beheben Sie die java.io.NotSerializableException in Java

Wir können die java.io.NotSerializableException in Java mit den folgenden Lösungen beheben.

  1. Suchen Sie die Klasse, die diese Ausnahme auslöst, und machen Sie sie Serialisierbar, indem Sie die Serializable-Schnittstelle implementieren. Denken Sie daran, dass diese Lösung möglicherweise keine gute Wahl ist, wenn eine Klasse, die die NotSerializableException auslöst, zur Bibliothek eines Drittanbieters gehört.

  2. Wir können die Objekte als transient deklarieren, wenn sich die Klasse auf die nicht serialisierbaren Objekte bezieht, wobei diese Objekte nicht serialisierbar sein dürfen. Die Frage ist, warum es als vorübergehend deklarieren?

    Dies liegt daran, dass die als transient deklarierten Felder der Klasse von der serialisierbaren Laufzeit ignoriert würden und wir keine Ausnahmen erhalten würden.

  3. Wenn wir seine Daten und deren Dritte benötigen, können wir andere Möglichkeiten der Serialisierung in Betracht ziehen. Zum Beispiel XML, JSON usw., wo wir die Objekte von Drittanbietern serialisieren können, ohne ihre Definitionen zu ändern.

In unserem Fall hat die Implementierung von Serializable die java.io.NotSerializableException behoben. Siehe den folgenden Beispielcode.

Beispielcode (Datei Students.java):

package com.serializertest;

import java.io.Serializable;

class Student implements Serializable {
  private String studentId;

  public String getId() {
    return studentId;
  }
  public void setId(String id) {
    this.studentId = id;
  }
}

Beispielcode (Datei SerializerTest.java):

package com.serializertest;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

public class SerializerTest {
  public static void main(String[] args) throws IOException {
    FileOutputStream fileOutputStream = new FileOutputStream("students.txt");
    ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);

    Student student = new Student();
    student.setId("0001");

    objectOutputStream.writeObject(student);
    objectOutputStream.close();
  }
}
Mehvish Ashiq avatar Mehvish Ashiq avatar

Mehvish Ashiq is a former Java Programmer and a Data Science enthusiast who leverages her expertise to help others to learn and grow by creating interesting, useful, and reader-friendly content in Computer Programming, Data Science, and Technology.

LinkedIn GitHub Facebook

Verwandter Artikel - Java Error