Подтвердить что ты не робот

Как работает сериализация, когда только подкласс реализует сериализуемое

Подкласс реализовал интерфейс Serializable.

import java.io.*;

public class NewClass1{

    private int i;
    NewClass1(){
    i=10;
    }
    int getVal() {
        return i;
    }
    void setVal(int i) {
        this.i=i;
    }
}

class MyClass extends NewClass1 implements Serializable{

    private String s;
    private NewClass1 n;

    MyClass(String s) {
        this.s = s;
        setVal(20);
    }

    public String toString() {
        return s + " " + getVal();
    }

    public static void main(String args[]) {
        MyClass m = new MyClass("Serial");
        try {
            ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("serial.txt"));
            oos.writeObject(m); //writing current state
            oos.flush();
            oos.close();
            System.out.print(m); // display current state object value
        } catch (IOException e) {
            System.out.print(e);
        }
        try {
            ObjectInputStream ois = new ObjectInputStream(new FileInputStream("serial.txt"));
            MyClass o = (MyClass) ois.readObject(); // reading saved object
            ois.close();
            System.out.print(o); // display saved object state
        } catch (Exception e) {
            System.out.print(e);
        }
    }
}

Одна вещь, которую я заметил здесь, - родительский класс не сериализуется. Затем, почему он не бросил NotSerializableException, действительно, он показывает следующие

Выход

Serial 20
Serial 10

Кроме того, вывод отличается от Serialization и De-serialization. Я просто знаю, это из-за родительского класса не реализовано Serializable. Но, если кто-нибудь объяснит мне, что происходит во время сериализации объектов и де-сериализации. Как это меняет стоимость? Я не могу понять, также я использовал комментарий в своей программе. Поэтому, если я ошибаюсь в любом случае, пожалуйста, дайте мне знать.

4b9b3361

Ответ 1

в соответствии с Serializable javadoc

Во время десериализации поля несериализуемых классов будут инициализируется с использованием открытого или защищенного конструктора no-arg класс. Конструктор no-arg должен быть доступен для подкласса, который является сериализации. Поля сериализуемых подклассов будут восстановлены из потока.

также исключение сериализации генерируется только в том случае, если сериализуемый класс не является сериализуемым. наличие несериализуемых родителей в порядке (если у них нет конструктора no-arg). Сам объект не является Serializable, и все его расширяет. приведенная выше цитата также объясняет, почему вы получаете разные значения для поля значений - задан конструктор no-arg для родительского класса, который устанавливает значение в поле значения 10 - это поле принадлежит родительскому объекту (несериализуемым), поэтому его значение isnt записанный в/чтение из потока.

Ответ 2

Если ваш MyClass содержит ссылку на объект класса без сериализации, вы получите исключение NotSerializable во время выполнения. Чтобы проверить, измените MyClass так, чтобы он содержал ссылку на объект NewClass1. Если вы снова запустите, это вызовет исключение.

Deserialization по существу создает экземпляр сериализуемого класса и восстанавливает его свойства. Во время этого процесса конструктор сериализуемого класса не вызывается. Вместо этого вызывается конструктор no arg первого несериализуемого суперкласса.

В вашем случае конструктор no arg newClass1 присваивает 10 своей переменной экземпляра i. Таким образом, во время десериализации он печатает 10 вместо 20.

Ответ 3

Я не тестировал его, но вы получите NotSerializableException, если сериализуете экземпляр базового класса. Это то же самое, когда ваш класс содержит некоторые члены, которые не являются Serializable.

Значит, если вы создаете объект NewClass1 nc1 = new NewClass1(); и пытаетесь выполнить сериализацию obj nc1, вы получите требуемое исключение.