Почему java.util.List не реализует Сериализуемый? - PullRequest
33 голосов
/ 08 февраля 2011

Почему java.util.List не реализует Serializable, в то время как подклассы типа LinkedList, Arraylist делают? Разве это не противоречит принципам наследования? Например, если мы хотим отправить Linkedlist по сети, мы должны написать:

new ObjectOutputStream(some inputStream).writeObject(some LinkedList);

Пока все хорошо, но, читая объект с другой стороны, мы должны подробно сказать LinkedList l = (LinkedList)objectInputStream.readObject(); вместо List l = (List)objectInputStream.readObject();. Если мы когда-либо изменим функциональность записи с LinkedList на ArrayList, нам также придется изменить часть чтения. Наличие List орудия Serializable решило бы проблему.

Ответы [ 9 ]

39 голосов
/ 08 февраля 2011

List не реализует Serializable, поскольку не является ключевым требованием для списка.Нет гарантии (или необходимости), что каждая возможная реализация List может быть сериализована.

LinkedList и ArrayList решили сделать это, но это зависит от их реализации.Другие реализации List не могут быть Serializable.

8 голосов
/ 08 февраля 2011

List - это интерфейс, и его расширение Serializable может означать, что любая реализация List должна быть сериализуемой.

Свойство serializable не является частью абстракции List и поэтому не должно требоваться для реализации.1003 *

3 голосов
/ 08 февраля 2011

Нет.LinkedList - это всегда список.Когда вы десериализуете связанный список, поскольку LinkedList является списком, вы можете написать

List l = (List) objectInputStream.readObject();

Тот факт, что l на самом деле является LinkedList, не важен.Вы хотели список, и вы получили список.

3 голосов
/ 08 февраля 2011

Поскольку List открыта для реализации также подклассами, специфичными для пользователя, и разработчики не обязательно хотят реализовать Serializable. Сериализуемость также не относится к ключевым обязанностям List, поэтому нет причин связывать их вместе.

2 голосов
/ 08 февраля 2011

Ваш вопрос, кажется, основан на недоразумении.Чтобы сериализовать объект, объект (или его класс) должен реализовать Serializable, но вам не нужно использовать выражение типа Serializable (или некоторый подтип) для этого.Совершенно преднамеренно, что метод writeObject имеет тип параметра Object, а не Serializable, а также тип возврата readObject().

Но даже если эти параметры и возвращаемые типы былиSerializable, вам не нужно знать конкретные типы реализации:

ObjectOutputStream stream = ...;
List myList = ...;
stream.writeObject((Serializable)myList);

и

ObjectInputStream stream = ...;
List myList = (List) stream.readObject();

будут работать так же, как и сейчас (без использования Serializable).

ObjectInputStream и ObjectOutputStream вообще не заботятся о ваших типах при вызове, они просто смотрят на объект и его класс.

2 голосов
/ 08 февраля 2011

Рассмотрим гипотетический ThreadList implements List<Thread>, содержащий список активных потоков в любой данный момент времени. Реализация прозрачно просматривает активные потоки и обеспечивает легкий доступ к ним - для вашего удобства. Должна ли такая реализация быть сериализуемой (забывая, что Thread не сериализуема)?

Лицо, реализующее интерфейс, должно решить, безопасна ли его реализация для сериализации. List является слишком общим, поскольку в основном указывает * упорядоченную коллекцию предметов типа T`.

0 голосов
/ 08 февраля 2011

Почему java.util.List не реализует Serializable ...

Потому что не каждая List реализация в мире должна быть Serializable.

при чтении объекта на другой стороне мы должны в полной мере сказать ... вместо

List l = (List) objectInputStream.readObject();

Вы пробовали это?Если вы это сделаете, я думаю, вы обнаружите, что это работает.

0 голосов
/ 08 февраля 2011

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

0 голосов
/ 08 февраля 2011

Список расширяет коллекцию, и он ничего не может реализовать, потому что это интерфейс ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...