Сериализация Java
Вступление
Создание объекта является фундаментальной особенностью Java и всех других объектно-ориентированных языков. Java позволяет записывать целые объекты в файлы, вместо того, чтобы отдельно записывать отдельные поля.
Представьте, что вы хотите сохранить состояние одного или нескольких объектов. Если в Java не было сериализации (как в самой ранней версии), вам пришлось бы использовать один из классов ввода-вывода, чтобы записать состояние переменных экземпляра всех объектов, которые вы хотите сохранить. Сериализация позволяет просто сказать «сохранить этот объект и все его переменные экземпляра».
Сериализация - это встроенный механизм Java для управления объектами как потоками байтов; Сериализуемый интерфейс наделяет ваш класс возможностью сериализации.
Работа с ObjectOutputStream и ObjectInputStream
Волшебство базовой сериализации происходит всего двумя способами: один для сериализации объектов и записи их в поток, а второй для чтения потока и десериализации объектов.
ObjectOutputStream.writeObject () // сериализация и запись
ObjectInputStream.readObject () // чтение и десериализация
Классы java.io.ObjectOutputStream и java.io.ObjectInputStream считаются классами более высокого уровня в пакете java.io, и, как мы узнали ранее, это означает, что вы будете заключать их в классы более низкого уровня, такие как java.io.FileOutputStream и java.io.FileInputStream.
Вот небольшая программа, которая создает (Employee) объект, сериализует его, а затем десериализует его:
Java-код:
package serializationdemo;
import java.io.*;
public class EmployeeSerialDemo {
public static void main(String[] args) {
Employee c = new Employee("Suresh", "E123"); // 2
File outFile = new File("empSerial.ser");
try {
FileOutputStream fs = new FileOutputStream(outFile);
ObjectOutputStream os = new ObjectOutputStream(fs);
os.writeObject(c); // 3
os.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
Ниже программа прочитает файл empSerial.ser, созданный этой программой, который хранит состояние объекта. Файл будет создан в корневом каталоге проекта, как показано ниже (путь по умолчанию, так как мы не упомянули полный путь)
Десериализация Демо Java класс
Java-код:
package serializationdemo;
import java.io.*;
public class EmployeeDeserialDemo {
public static void main(String[] args) {
File ReadFile = new File("empSerial.ser");
try {
FileInputStream fis = new FileInputStream(ReadFile);
ObjectInputStream ois = new ObjectInputStream(fis);
Employee e = (Employee) ois.readObject();
System.out.println("Deserialized Employee name="+ e.geteName());
System.out.println("Deserialized Employee ID="+ e.geteId());
ois.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
Выход:
Давайте посмотрим на ключевые моменты в этом примере
1. Мы заявляем, что класс Employee реализует интерфейс Serializable. Serializable - интерфейс маркера; у него нет методов для реализации.
2. Мы создаем новый объект Employee, который, как мы знаем, является Сериализуемым.
3. Мы сериализуем объект Employee c, вызывая метод writeObject (). Вызов методаwriteObject () выполняет две задачи: он сериализует объект, а затем записывает сериализованный объект в файл.
4. Мы десериализовываем объект Employee, вызывая метод readObject (). МетодreadObject () возвращает Object, поэтому мы должны привести десериализованный объект обратно к объекту Employee.
Сериализация с композицией (Has-A) отношения
Композиция (HAS-A) просто означает использование переменных экземпляра, которые являются ссылками на другие объекты. Давайте разберемся, если у класса Employee есть ссылка на объект отдела и если класс отдела не реализует интерфейс Serializable, тогда мы должны объявить ссылку на отдел как временную, иначе мы получим исключение при вызове метода serialize.
Java-код:
package serializationdemo;
import java.io.*;
public class EmployeeWithDepartmentSerialDemo {
public static void main(String[] args) {
// Creating object of NewEmployee class
NewEmployee c = new NewEmployee("Suresh", "E123", new Department());
File outFile = new File("NewEmpSerial.ser");
try {
FileOutputStream fs = new FileOutputStream(outFile);
ObjectOutputStream os = new ObjectOutputStream(fs);
os.writeObject(c); // 3
os.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
Java-код:
package serializationdemo;
import java.io.Serializable;
class NewEmployee implements Serializable {
private static final long serialVersionUID = 1L;
private String eName;
private String eId;
private Department dName;
public String geteName() {
return eName;
}
public String geteId() {
return eId;
}
public Department getdName() {
return dName;
}
NewEmployee(String a, String b, Department d){
this.eName = a;
this.eId = b;
this.dName = d;
}
}
Выход:
Сериализация с наследованием
Если суперкласс является Serializable, то в соответствии с обычными правилами интерфейса Java все подклассы этого класса автоматически неявно реализуют Serializable. Другими словами, подкласс класса, помеченного как Serializable, проходит тест IS-A для Serializable и, следовательно, может быть сохранен без необходимости явно помечать подкласс как Serializable.
Если вы сериализуете коллекцию или массив, каждый элемент должен быть сериализуемым. Один несериализуемый элемент вызовет сбой сериализации, если не объявлен переходный.
Сериализация не для статических переменных
Наконец, вы можете заметить, что мы говорили ТОЛЬКО о переменных экземпляра, а не о статических переменных. Это потому, что статические переменные не являются частью состояния экземпляра, поэтому не являются частью процесса сериализации.
Резюме:
- Класс должен реализовывать интерфейс Serializable, прежде чем его объекты могут быть сериализованы.
- Метод ObjectOutputStream.writeObject () сериализует объекты, а метод ObjectInputStream.readObject () десериализует объекты.
- Если вы пометите переменную экземпляра как переходную, она не будет сериализована, хотя остальная часть состояния объекта будет.
- Если суперкласс реализует Serializable, то его подклассы делают автоматически.
Редактор кода Java:
Предыдущая: Обработка файла свойств Java
Далее: Java Collection Framework
Новый контент: Composer: менеджер зависимостей для PHP , R программирования