Изучение defaultWriteObject: метод сериализации Java

“Что такое defaultWriteObject” — это метод в Java, который позволяет объекту сохранять свое непереходное состояние в поток. Обычно он используется в сочетании с механизмом сериализации, предоставляемым Java, для сохранения объектов или их отправки по сети.

Когда объект необходимо сериализовать, метод defaultWriteObject вызывается внутри метода writeObject. Он записывает непереходные поля объекта в поток. Ключевое слово transient используется для обозначения полей, которые не следует сериализовать.

Давайте рассмотрим пример, чтобы лучше понять:

import java.io.*;
class MyClass implements Serializable {
    private String name;
    private transient int age;
    public MyClass(String name, int age) {
        this.name = name;
        this.age = age;
    }
    private void writeObject(ObjectOutputStream out) throws IOException {
        out.defaultWriteObject();
        out.writeInt(age);
    }
    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
        in.defaultReadObject();
        age = in.readInt();
    }
    public String toString() {
        return "Name: " + name + ", Age: " + age;
    }
}
public class SerializationExample {
    public static void main(String[] args) {
        MyClass obj = new MyClass("John", 25);
        try {
            FileOutputStream fileOut = new FileOutputStream("data.ser");
            ObjectOutputStream out = new ObjectOutputStream(fileOut);
            out.writeObject(obj);
            out.close();
            fileOut.close();
            FileInputStream fileIn = new FileInputStream("data.ser");
            ObjectInputStream in = new ObjectInputStream(fileIn);
            MyClass newObj = (MyClass) in.readObject();
            in.close();
            fileIn.close();
            System.out.println(newObj);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

В этом примере у нас есть MyClass, реализующий интерфейс Serializable. Поле ageпомечено как временное, что указывает на то, что его не следует сериализовать.

Метод writeObjectпереопределяет поведение сериализации по умолчанию и сначала вызывает out.defaultWriteObject()для записи непереходных полей (в данном случае nameполе), а затем явно записывает поле age, используя out.writeInt(age).

Аналогично, метод readObjectпереопределяет поведение десериализации по умолчанию. Сначала он вызывает in.defaultReadObject()для чтения непереходных полей, а затем считывает поле ageс помощью age = in.readInt().

Когда вы запускаете класс SerializationExample, он создает экземпляр MyClass, сериализует его в файл с именем «data.ser», а затем десериализует обратно в файл. новый объект. Метод toStringпереопределяется для отображения состояния объекта.

Используя defaultWriteObjectи defaultReadObject, мы контролируем процесс сериализации и десериализации и можем настроить его в соответствии с нашими потребностями.

Подводя итог, defaultWriteObject— это метод Java, который позволяет объектам сохранять свое непереходное состояние во время сериализации. Понимая этот метод и то, как его использовать, вы сможете эффективно управлять сериализацией и десериализацией объектов в ваших программах Java.