ObjectOutputStream in Java – Objekt in Datei schreiben

ObjectOutputStream in Java kann verwendet werden, um ein Objekt in einen OutputStream zu konvertieren. Der Prozess der Umwandlung eines Objekts in einen Stream wird als Serialisierung in Java bezeichnet. Sobald ein Objekt in einen Output Stream konvertiert ist, kann es in einer Datei oder Datenbank gespeichert, über das Netzwerk gesendet oder in Socket-Verbindungen verwendet werden. Daher können wir FileOutputStream verwenden, um ein Objekt in eine Datei zu schreiben.

ObjectOutputStream

ObjectOutputStream ist Teil der Java IO-Klassen, und sein gesamter Zweck besteht darin, uns eine Möglichkeit zu bieten, ein Java-Objekt in einen Stream zu konvertieren. Wenn wir eine Instanz von ObjectOutputStream erstellen, müssen wir den zu verwendenden OutputStream bereitstellen. Dieser OutputStream wird von ObjectOutputStream weiterhin verwendet, um den Objektstrom zum zugrunde liegenden Ausgabestrom zu leiten, zum Beispiel FileOutputStream.

ObjectOutputStream-Anforderung

Das Objekt, das wir serialisieren möchten, sollte das java.io.Serializable Interface implementieren. Serializable ist lediglich ein Marker-Interface und enthält keine abstrakte Methode, die wir implementieren müssen. Wir erhalten eine java.io.NotSerializableException, wenn die Klasse das Serializable-Interface nicht implementiert. Etwas Ähnliches wie unten stehender Ausnahme-Stack-Trace.

java.io.NotSerializableException: com.journaldev.files.EmployeeObject
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)
	at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
	at com.journaldev.files.ObjectOutputStreamExample.main(ObjectOutputStreamExample.java:21)

Java ObjectOutputStream Beispiel zum Schreiben eines Objekts in eine Datei

Lassen Sie uns nun das Java-ObjectOutputStream-Beispiel betrachten, um ein Objekt in eine Datei zu schreiben. Dafür benötigen wir zunächst eine Klasse mit einigen Eigenschaften. Erstellen wir ein Objekt, das wir in die Datei speichern werden.

package com.journaldev.files;

import java.io.Serializable;

public class Employee implements Serializable {

	private static final long serialVersionUID = -299482035708790407L;

	private String name;
	private String gender;
	private int age;

	private String role;
	// private transient String role;

	public Employee(String n) {
		this.name = n;
	}

	public String getGender() {
		return gender;
	}

	public void setGender(String gender) {
		this.gender = gender;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getRole() {
		return role;
	}

	public void setRole(String role) {
		this.role = role;
	}

	@Override
	public String toString() {
		return "Employee:: Name=" + this.name + " Age=" + this.age + " Gender=" + this.gender + " Role=" + this.role;
	}

}

Beachten Sie, dass es keine Voraussetzung ist, Getter/Setter für alle Eigenschaften zu haben oder einen parameterlosen Konstruktor zu haben. Wie Sie sehen können, hat das obige Employee-Objekt keine Getter/Setter-Methoden für die Eigenschaft „name“. Es hat auch keinen parameterlosen Konstruktor. Hier ist das Programm, das zeigt, wie man ein Objekt in Java mit ObjectOutputStream in eine Datei schreibt.

package com.journaldev.files;

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

public class ObjectOutputStreamExample {

	public static void main(String[] args) {
		Employee emp = new Employee("Pankaj");

		emp.setAge(35);
		emp.setGender("Male");
		emp.setRole("CEO");
		System.out.println(emp);
		
		try {
			FileOutputStream fos = new FileOutputStream("EmployeeObject.ser");
			ObjectOutputStream oos = new ObjectOutputStream(fos);
			// Objekt in Datei schreiben
			oos.writeObject(emp);
			System.out.println("Done");
			// Ressourcen schließen
			oos.close();
			fos.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}

Unten ist das Ergebnis des oben genannten Programms dargestellt. Wenn Sie sich fragen, was sich im EmployeeObject.ser-Datei befindet, ist es etwas durcheinander und ähnelt dem folgenden.

��srcom.journaldev.files.Employee�����yyIageLgendertLjava/lang/String;Lnameq~Lroleq~xp#tMaletPankajtCEO

ObjectOutputStream mit einem transienten

Wenn wir nicht möchten, dass eine Objekteigenschaft in einen Stream umgewandelt wird, müssen wir das Schlüsselwort „transient“ verwenden. Ändern Sie einfach die Rolleigenschaft wie unten gezeigt, und sie wird nicht gespeichert.

private transient String role;

ObjectOutputStream und serialVersionUID

Haben Sie die serialVersionUID bemerkt, die im Employee-Objekt definiert ist? Sie wird von den Klassen ObjectOutputStream und ObjectInputStream für Schreib- und Lesevorgänge mit Objekten verwendet. Obwohl es nicht obligatorisch ist, dieses Feld zu haben, sollten Sie es beibehalten. Andernfalls, wenn Sie Ihre Klasse ändern und dies keinen Einfluss auf zuvor serialisierte Objekte hat, wird es fehlschlagen. Für eine detaillierte Analyse gehen Sie zu Serialisierung in Java. Wenn Sie sich fragen, ob unser Programm gut funktioniert hat oder nicht, verwenden Sie den folgenden Code, um ein Objekt aus der gespeicherten Datei zu lesen.

FileInputStream is = new FileInputStream("EmployeeObject.ser");
ObjectInputStream ois = new ObjectInputStream(is);
Employee emp = (Employee) ois.readObject();

ois.close();
is.close();
System.out.println(emp.toString());
//Ausgabe wird "Mitarbeiter:: Name=Pankaj Alter=35 Geschlecht=Männlich Rolle=CEO"

Das ist alles über java ObjectOutputStream und wie man es benutzt, um das Objekt in eine Datei zu schreiben.

Sie können weitere Java-IO-Beispiele aus unserem GitHub-Repository überprüfen.

Referenz: API-Dokumentation

Source:
https://www.digitalocean.com/community/tutorials/objectoutputstream-java-write-object-file