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

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

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

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

Ответ 6

Ваш вопрос, похоже, основан на недоразумении. Для сериализации объекта объект (или его класс) должен реализовать 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 вообще не заботятся о ваших типах при вызове, они просто смотрят на объект под рукой и его класс.

Ответ 7

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

Ответ 8

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

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

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

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

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

Ответ 9

List extends Collection, и он ничего не может реализовать, потому что это интерфейс...