Рубрики
Без рубрики

ObjectOutputStream в Java – запись объекта в файл

ObjectOutputStream в Java, Пример Java ObjectOutputStream для записи объекта в файл, метод writeObject, Сериализуемый интерфейс, пример serialVersionUID.

Автор оригинала: 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