2013-05-18 5 views
3

Сериализуем наследование. Частично, если у меня естьЯвляется сериализуемым наследуемым

class A implements Serializable{} 

class B extends A{} 

Является ли класс B сериализуемым?

+0

'B' не является сериализуемым, он наследует от суперкласса, реализует интерфейс Serializable, IMO, который имеет значение семантики в Java. – 0x90

+6

Это ясно упоминается в Java [docs] (http://docs.oracle.com/javase/1.5.0/docs/api/java/io/Serializable.html), "* Сериализуемость класса включена класс, реализующий интерфейс 'java.io.Serializable'. Классы, которые не реализуют этот интерфейс, не будут иметь своего состояния, сериализованного или десериализованного. ** Все подтипы сериализуемого класса сами сериализуемы. ***« – Lion

+3

@ 0x90 : Расширение класса или реализация интерфейса точно определяет отношение * к *. Так что да, B * является * Serializable. –

ответ

2

Да. Это следует из концепции наследования в Java. Так как A сериализуемо и B расширяет A, B является serializalbe.

Обратите внимание, что все нестатические непереходные поля A и B также должны содержать объекты, которые могут быть сериализованы, иначе во время выполнения будет выполняться исключение NotSerializableException, когда вы попытаетесь их сериализовать.

2

Да, подкласс Serializable класса также сериализации

Для получения дополнительной информации

http://docs.oracle.com/javase/1.5.0/docs/api/java/io/Serializable.html

http://java.sun.com/developer/technicalArticles/ALT/serialization/

+0

Требуется только ссылка [JLS # 8.1.5] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.1.5). Нечего делать специально с 'Serializable' вообще. – EJP

+0

@EJP Спасибо за информацию ... – Pragnani

0

Если класс Сериализуемый то все подклассы Сериализуемые. Но если вы хотите предотвратить подкласс, чей суперкласс Serializable может быть сериализуемым, это также возможно.

Если вы хотите, чтобы предотвратить то использовать

NotSerializableException - Брошенный, когда требуется экземпляр иметь Serializable интерфейс. Сериализация или класс экземпляра могут вызывать это исключение. Аргументом должно быть имя класса.

см Официальные документы - http://docs.oracle.com/javase/6/docs/api/java/io/NotSerializableException.html

Используя его, таким образом, вы можете выполнить эту задачу

private void writeObject(ObjectOutputStream out) throws IOException { 

    throw new NotSerializableException(“Not today!”); 
} 


private void readObject(ObjectInputStream in) throws IOException { 

    throw new NotSerializableException(“Not today!”); 

} 

Как насчет подклассов сериализации Но родительский класс не

Если Sub-класс является Serializable, это абсолютно не означает, что его суперкласс также является Serializable. Когда подкласс сериализуется, будет создан конструктор без аргументов суперкласса.

0

oracle tutorial:

Интерфейсы имеют другую очень важную роль в Java программирование языка. Интерфейсы не являются частью иерархии классов, хотя работают в комбинации с классами. Язык программирования Java не допускает множественного наследования (наследование рассматривается ниже в этом уроке), но интерфейсы предоставляют альтернативу.

В Java класс может наследовать только от одного класса, но он может реализовать более одного интерфейса. Следовательно, объекты могут иметь несколько типов: тип их собственного класса и типы всех интерфейсов, которые они реализуют .Это означает, что если переменная объявлена ​​как тип интерфейса , ее значение может ссылаться на любой объект, который является , созданный из любого класса, который реализует интерфейс. Это , рассмотренный ниже в этом уроке, в разделе «Использование интерфейса как тип».

Я предполагаю, что вы имеете в виду, если у вас есть функция foo которая получает (Serializable ptr), вы можете назвать его с экземпляром Class B поэтому ответ да, то есть идея.

Кроме того, вы можете переопределить реализацию A (предка).

2

ли следующая проверка на данном коде

boolean b = new B() instanceof Serializable; 
System.out.println(b); 

который возвращает true

+0

Нет необходимости выполнять код, чтобы ответить на этот вопрос. Это относится к спецификации языка Java. – EJP

+0

@ EJP ohk !! но хотел ответить другим способом. Если не будет смысла, я удалю. – ajduke

0

Всех интерфейсов, реализованных базовые классы наследуются их производные классами. Не только Serializable.

0

Я согласен с тем, что Serializable-ness наследуется, но имеет проблемы (хотя и редко), когда этот факт не распознается случайным инструментом. Поэтому, даже если это не требуется, я сделаю дополнительные усилия, чтобы объявить подкласс как реализацию Serializable.

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