2016-09-08 2 views
0

Я только что прочитал документацию Serialization и был отчасти удивлен этим (подчеркнуто мой):Serilalization подклассов

Метод writeObject отвечает за запись состояния объекта для его определенного класса, так что соответствующий метод readObject может восстановить его. Механизм по умолчанию для сохранения полей объекта можно вызвать, вызвав out.defaultWriteObject. Метод не нужно относиться к себе с государством, принадлежащих к его суперкласса или подклассов. Состояние сохраняется путем записи отдельных полей в ObjectOutputStream с использованием метода writeObject или с использованием методов примитивных типов данных, поддерживаемых DataOutput.

Таким образом, это не гарантирует, что superclass «s будет сериализовать в следующем случае:

public class MySuperClass implements Serializable{ 
    public int a; 
} 

public class MySubClass extends MySuperClass{ 
    public int b; 
} 

MySubClass msc = new MySubClass(); 
msc.a = 10 
msc.b = 20 

//serialize msc 

Таким образом, это зависит от конкретной реализации, если значение десериализованного msc.a будет 10 или 0?

+1

Как вы переводили «не нужно беспокоиться» на «не гарантировано»? – Kayaman

+0

@ Кайаман Да, мое непонимание документации. – user3663882

ответ

1

Здесь writeObject и readObject не относится к методам ObjectOutputStream/ObjectInputStream, но методы, которые вы можете при необходимости реализовать в своем собственном классе, если вам требуется другое поведение сериализации, чем по умолчанию. В этой части документации указано, что вам нужно, касаясь себя или нет, при реализации этих методов. Но поскольку вы не используете эту функцию в своем примере, эта часть документации не имеет значения.

1

В документации, расположенной выше абзаца, вы выдержанной, говорится, что классы , требующие специальной обработки во время процесса сериализации и десериализации, должны реализовывать специальные методы. Этими методами являются методы writeObject и readObject, упомянутые в @Beethoven.

Что касается вопроса, который вы задали о значении msc.a, то он определенно будет 10. Это будет 0, если ваш суперкласс не реализует Serializable, но подкласс делает. Даже ваш суперкласс не реализует Serializable, вы можете указать значение по умолчанию msc.a в конструкторе noarg.

Смежные вопросы