ObjectOutputStream в Java можно использовать для преобразования объекта в OutputStream. Процесс преобразования объекта в поток называется сериализация в Java. Как только объект преобразуется в Output Stream, его можно сохранить в файл или базу данных, отправить по сети или использовать в сокетных соединениях. Поэтому мы можем использовать FileOutputStream для записи объекта в файл.
ObjectOutputStream
ObjectOutputStream является частью классов Java IO, и его главная цель – предоставить нам способ преобразования объекта Java в поток. При создании экземпляра ObjectOutputStream мы должны предоставить OutputStream для использования. Этот OutputStream затем используется ObjectOutputStream для направления потока объекта к базовому выходному потоку, например, FileOutputStream.
Требования к ObjectOutputStream
Объект, который мы хотим сериализовать, должен реализовывать интерфейс java.io.Serializable
interface. Serializable – это всего лишь маркерный интерфейс и не имеет никаких абстрактных методов, которые нам нужно реализовать. Если класс не реализует интерфейс Serializable, мы получим исключение java.io.NotSerializableException
. Что-то вроде следующего стека исключений.
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 для записи объекта в файл
Давайте рассмотрим пример использования java ObjectOutputStream для записи объекта в файл. Для этого сначала у нас должен быть класс с некоторыми свойствами. Давайте создадим объект, который мы будем сохранять в файл.
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;
}
}
Обратите внимание, что не требуется иметь геттер/сеттер для всех свойств или иметь конструктор без аргументов. Как видите, у вышеуказанного объекта Employee нет методов геттера/сеттера для свойства “name”. У него также нет конструктора без аргументов. Вот программа, показывающая, как записать объект в файл в Java с использованием 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);
// запись объекта в файл
oos.writeObject(emp);
System.out.println("Done");
// закрытие ресурсов
oos.close();
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Ниже показан вывод вышеуказанной программы. Если вы задаетесь вопросом, что содержится в файле EmployeeObject.ser
, то он немного искажен и выглядит примерно так.
��srcom.journaldev.files.Employee�����yyIageLgendertLjava/lang/String;Lnameq~Lroleq~xp#tMaletPankajtCEO
ObjectOutputStream с transient
Если мы не хотим, чтобы некоторое свойство объекта преобразовывалось в поток, нам нужно использовать ключевое слово transient. Например, просто измените свойство роли как показано ниже, и оно не будет сохранено.
private transient String role;
ObjectOutputStream и serialVersionUID
Вы заметили serialVersionUID
, определенный в объекте Employee? Его используют классы ObjectOutputStream
и ObjectInputStream
для операций записи и чтения объектов. Хотя это поле не является обязательным, его лучше оставить. В противном случае при изменении класса это не повлияет на ранее сериализованные объекты, и программа может начать работать некорректно. Для подробного анализа смотрите Сериализация в Java. Если вы задаетесь вопросом, правильно ли отработала наша программа, используйте следующий код для чтения объекта из сохраненного файла.
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());
//Output будет "Employee:: Name=Pankaj Age=35 Gender=Male Role=CEO"
Это все о java ObjectOutputStream и как его использовать для записи объекта в файл.
Вы можете проверить больше примеров ввода-вывода Java в нашем Репозитории GitHub.
Ссылка: API Документация
Source:
https://www.digitalocean.com/community/tutorials/objectoutputstream-java-write-object-file