Pourquoi est-ce que Java.util.List
n'implémente pas Serializable
alors que des sous-classes telles que LinkedList
, Arraylist
le font? Cela ne semble-t-il pas aller à l'encontre des principes d'héritage? Par exemple, si nous voulons envoyer une liste liée sur un réseau, nous devons écrire:
new ObjectOutputStream(some inputStream).writeObject(some LinkedList);
Jusqu'ici tout va bien, mais en lisant l'objet de l'autre côté, nous devons explicitement dire LinkedList l = (LinkedList)objectInputStream.readObject();
au lieu de List l = (List)objectInputStream.readObject();
. Si nous devions un jour changer la fonctionnalité d'écriture de LinkedList
pour dire ArrayList
, nous devrons également changer la partie lecture. Avoir List
implémenter Serializable
aurait résolu le problème.
List
n'implémente pas Serializable
car ce n'est pas une exigence clé pour une liste. Il n'y a aucune garantie (ni besoin) que chaque implémentation possible d'une List
puisse être sérialisée.
LinkedList
et ArrayList
choisissent de le faire, mais cela dépend de leur implémentation. Les autres implémentations List
peuvent ne pas être Serializable
.
List est une interface et son extension Serializable signifierait que toute implémentation de List devrait être sérialisable.
La propriété sérialisable ne fait pas partie de l'abstraction de la liste et ne doit donc pas être requise pour une implémentation.
Étant donné que List
peut également être implémenté par des sous-classes spécifiques à l'utilisateur, les implémenteurs ne souhaitent pas nécessairement implémenter Serializable
. La sérialisabilité n’appartenant pas non plus aux responsabilités principales d’un List
, il n’ya donc aucune raison de relier les deux.
Non. Une LinkedList est toujours une liste. Lorsque vous désérialisez la liste liée, puisqu'un LinkedList est une liste, vous pouvez écrire
List l = (List) objectInputStream.readObject();
Le fait que je sois en fait une LinkedList n’a pas d’importance. Vous vouliez une liste et vous en avez une.
Considérez l'hypothèse ThreadList implements List<Thread>
, contenant la liste des threads actifs à un moment donné. L'implémentation parcourt de manière transparente les threads actifs et permet d'y accéder facilement, pour votre commodité. Une telle implémentation doit-elle être sérialisable (en oubliant que Thread
n'est pas sérialisable)?
Il appartient à la personne implémentant l'interface de décider si son implémentation peut être sérialisée en toute sécurité. List
est trop générique, comme l’indique en gros * une collection ordonnée d’articles de type T`.
Votre question semble être basée sur un malentendu. Pour sérialiser un objet, cet objet (ou sa classe) doit implémenter Serializable
, mais vous n'avez pas besoin d'utiliser une expression de type Serializable
(ou un sous-type) pour cela. Il est tout à fait intentionnel que la méthode writeObject
ait un type de paramètre Object
et non Serializable
, ainsi que le type de retour readObject()
.
Mais même si ces types de paramètre et de retour étaient Serializable
, vous n’auriez pas besoin de connaître les types d’implémentation spécifiques:
ObjectOutputStream stream = ...;
List myList = ...;
stream.writeObject((Serializable)myList);
et
ObjectInputStream stream = ...;
List myList = (List) stream.readObject();
fonctionnerait aussi bien que cela fonctionne maintenant (sans la distribution Serializable).
ObjectInputStream et ObjectOutputStream ne se soucient pas du tout de vos types lors de l'appel, ils se contentent de regarder l'objet en question et sa classe.
Si List implémente/étend Serializable, le contrat stipule que toutes les classes/sous-classes d'implémentation de List sont également Serializable, ce qui n'est pas toujours vrai. Par exemple, regardez l’implémentation de ForwardingListMultimap dans les collections de goyaves. Il n'est pas nécessaire que Serializable soit fonctionnellement et cela n'a été possible que parce que List n'est pas Serializable.
Pourquoi est-ce que Java.util.List n'implémente pas Serializable ...
Parce que chaque implémentation List
du monde ne doit pas nécessairement être Serializable
.
lors de la lecture de l'objet de l'autre côté, nous devons dire explicitement ... au lieu de
List l = (List) objectInputStream.readObject();
L'as tu essayé? Si vous le faites, je pense que vous constaterez que cela fonctionne.