Почему 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
могла бы решить проблему.
Ответы
Ответ 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, и он ничего не может реализовать, потому что это интерфейс...