Расширение класса, реализующего Serializable

Если я расширяю класс, который реализует Serializable, нужно ли мне, чтобы этот класс также реализовывал Serializable?

Например, если у меня есть,

public class classToBeExtended implements Serializable

Тогда этого будет достаточно?

public class classThatWillExtend extends classToExtended

Или мне нужно это сделать?

public class classThatWillExtend extends classToExtended implements Serializable

person Mars    schedule 15.11.2017    source источник
comment
Если вы расширяете класс, который реализует List, нужно ли вам снова объявлять, что подкласс также является List? Почему для Serializable должно быть по-другому?   -  person Andy Turner    schedule 15.11.2017


Ответы (2)


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

Другое следствие состоит в том, что если вы расширяете класс Serializable, вы должны убедиться, что подкласс действительно сериализуем. Например, не добавляйте не-transient поля несериализуемых типов, если вы не готовы также добавить необходимые методы для их поддержки.

person John Bollinger    schedule 15.11.2017

Согласно Javadoc:

Все подтипы сериализуемого класса сами сериализуемы.

person tsolakp    schedule 15.11.2017
comment
Это немного вводит в заблуждение: все подтипы класса, реализующие Serializable, также реализуют Serializable; это ничего не говорит о том, можно ли на самом деле сериализовать любой из них. - person Andy Turner; 15.11.2017
comment
@Энди Тернер. Не уверен, что вы имеете в виду. Из заявления Javadoc это должно означать, что подклассы сериализуемы без необходимости реализации интерфейса. По крайней мере, я так читаю. - person tsolakp; 15.11.2017
comment
реализация Serializable является необходимым, но недостаточным условием для возможности сериализации. Вы можете добавить поля несериализуемого типа в класс, реализующий Serializable, и если они не равны нулю (и тип ссылки во время выполнения не является сериализуемым), сериализация завершится ошибкой. - person Andy Turner; 15.11.2017
comment
Например: class A { class B implements Serializable {} }: экземпляры B не сериализуемы из-за неявной ссылки на несериализуемый A. - person Andy Turner; 15.11.2017
comment
Конечно вещь. Но смысл утверждения в том, что среда выполнения Java попытается сериализовать подкласс. Будет ли это успешным, это другой вопрос. - person tsolakp; 15.11.2017
comment
@tsolakp вы можете попытаться сериализовать любой объект, независимо от того, реализует ли он Serializable: ObjectOutputStream принимает Object параметров, а не Serializable. - person Andy Turner; 15.11.2017
comment
И именно поэтому важно различать реализацию Serializable и фактическую сериализуемость быть, @tsolakp, чего не может сделать процитированный вами комментарий javadoc, что и вводит его в заблуждение. - person John Bollinger; 15.11.2017
comment
@Энди Тернер. Java не будет пытаться сериализовать состояние объекта, если он не реализует Serializable. То, что попытается сделать код, и то, что попытается сделать среда выполнения, — это две разные вещи. Я не думаю, что Java может гарантировать, что объект, который является экземпляром Serializable, на 100% сериализуем. Единственной гарантией того, что он предполагает сериализуемость, является сам интерфейс маркера Serializable. - person tsolakp; 15.11.2017
comment
@tsolakp Я не уверен, что вы имеете в виду под Java, не буду пробовать: конечно, да. Он пытается, и именно тогда он терпит неудачу с NotSerializableException, если значение ссылки во время выполнения ссылается на несериализуемый объект. Если бы он не пытался что-то сделать, исключение не возникло бы. - person Andy Turner; 16.11.2017
comment
И вы только что повторили мою исходную точку: Serializable не является гарантией сериализуемости. - person Andy Turner; 16.11.2017