Автор оригинала: Pankaj Kumar.
ObjectOutputStream в Java можно использовать для преобразования объекта в OutputStream. Процесс преобразования объекта в поток в java называется сериализацией .
Как только объект преобразуется в выходной поток, его можно сохранить в файл или базу данных, отправить по сети или использовать в соединениях сокетов. Таким образом, мы можем использовать FileOutputStream для записи объекта в файл.
Поток вывода объекта
ObjectOutputStream является частью классов ввода-вывода Java, и вся его цель состоит в том, чтобы предоставить нам способ преобразования объекта java в поток. Когда мы создаем экземпляр ObjectOutputStream, мы должны предоставить используемый выходной поток. Этот выходной поток далее используется ObjectOutputStream для передачи потока объектов в базовый выходной поток, например, FileOutputStream .
Требование к потоку вывода объекта
Объект, который мы хотим сериализовать, должен реализовать java.io.Сериализуемый
| интерфейс . Сериализуемый-это просто интерфейс маркера, и у него нет никакого абстрактного метода, который мы должны реализовать. Мы получим 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 для записи объекта в файл
Le,давайте рассмотрим пример 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 не имеет методов получения/настройки для свойства “имя”. У него также нет конструктора без аргументов.
Вот программа, показывающая, как записать объект в файл на 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); // write object to file oos.writeObject(emp); System.out.println("Done"); // closing resources oos.close(); fos.close(); } catch (IOException e) { e.printStackTrace(); } } }
На рисунке ниже показан результат работы вышеуказанной программы.
Если вам интересно, каково содержимое файла Employee Object.set
, оно немного искажено и выглядит примерно так, как показано ниже.
��srcom.journaldev.files.Employee�����yyIageLgendertLjava/lang/String;Lnameq~Lroleq~xp#tMaletPankajtCEO
Поток вывода объекта с переходным
Если мы не хотим, чтобы какое-либо свойство объекта было преобразовано в поток, мы должны использовать для этого ключевое слово 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 will be "Employee:: Name=Pankaj Age=35 Gender=Male Role=CEO"
Это все о java ObjectOutputStream и о том, как использовать его для записи объекта в файл.
Ссылка: API Doc