ObjectOutputStream in Java può essere utilizzato per convertire un oggetto in OutputStream. Il processo di conversione dell’oggetto in flusso viene chiamato serializzazione in Java. Una volta che un oggetto è convertito in Output Stream, può essere salvato su file o database, inviato tramite rete o utilizzato in connessioni socket. Quindi possiamo utilizzare FileOutputStream per scrivere l’oggetto su file.
ObjectOutputStream
ObjectOutputStream fa parte delle classi Java IO e il suo scopo principale è fornirci un modo per convertire un oggetto Java in uno stream. Quando creiamo un’istanza di ObjectOutputStream, dobbiamo fornire l’OutputStream da utilizzare. Questo OutputStream viene successivamente utilizzato da ObjectOutputStream per instradare lo stream dell’oggetto verso l’output stream sottostante, ad esempio, FileOutputStream.
Requisiti di ObjectOutputStream
L’oggetto che vogliamo serializzare dovrebbe implementare l’interfaccia java.io.Serializable
. Serializable è solo un’interfaccia di marcatura e non ha alcun metodo astratto che dobbiamo implementare. Otterremo java.io.NotSerializableException
se la classe non implementa l’interfaccia Serializable. Qualcosa simile alla traccia dello stack delle eccezioni qui sotto.
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)
Esempio di Java ObjectOutputStream per scrivere l’oggetto su file
Guardiamo un esempio di Java ObjectOutputStream per scrivere un oggetto su file. Per questo, innanzitutto, dovremmo avere una classe con alcune proprietà. Creiamo un oggetto che salveremo nel file.
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;
}
}
Nota che non è obbligatorio avere getter/setter per tutte le proprietà. O avere un costruttore senza argomenti. Come puoi vedere, l’oggetto Employee sopra non ha metodi getter/setter per la proprietà “name”. Non ha neanche un costruttore senza argomenti. Ecco il programma che mostra come scrivere un oggetto su file in Java usando ObjectOutputStream.
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);
// scrivi oggetto su file
oos.writeObject(emp);
System.out.println("Done");
// chiusura delle risorse
oos.close();
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Ecco l’immagine che mostra l’output del programma precedente. Se stai cercando di capire quale sia il contenuto del file
EmployeeObject.ser
, è un po’ confuso e qualcosa del genere.
��srcom.journaldev.files.Employee�����yyIageLgendertLjava/lang/String;Lnameq~Lroleq~xp#tMaletPankajtCEO
ObjectOutputStream con un transient
Se non vogliamo che una certa proprietà dell’oggetto venga convertita in stream, dobbiamo utilizzare la parola chiave transient. Ad esempio, basta modificare la proprietà del ruolo come segue e non verrà salvata.
private transient String role;
ObjectOutputStream e serialVersionUID
Hai notato il serialVersionUID
definito nell’oggetto Employee? Viene utilizzato dalle classi ObjectOutputStream
e ObjectInputStream
per operazioni di scrittura e lettura degli oggetti. Anche se non è obbligatorio avere questo campo, è consigliabile mantenerlo. Altrimenti, ogni volta che modifichi la tua classe senza che ciò abbia effetto sugli oggetti serializzati in precedenza, inizierà a fallire. Per un’analisi dettagliata, vai su Serialization in Java. Se stai cercando di capire se il nostro programma ha funzionato correttamente o meno, utilizza il codice seguente per leggere un oggetto dal file salvato.
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());
//L'output sarà "Dipendente:: Nome=Pankaj Età=35 Genere=Maschio Ruolo=CEO"
Questo è tutto su java ObjectOutputStream e come usarlo per scrivere l’oggetto su file.
Puoi controllare più esempi di Java IO dal nostro Repository GitHub.
Riferimento: Doc API
Source:
https://www.digitalocean.com/community/tutorials/objectoutputstream-java-write-object-file