web-dev-qa-db-fra.com

Pourquoi Java.util.List n'implémente-t-il pas Serializable?

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.

31
Swaranga Sarma

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.

36
Aaron

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.

7
Dunaril

É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.

3
Péter Török

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.

3
JB Nizet

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`.

2
Tomasz Nurkiewicz

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.

1
Paŭlo Ebermann

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.

0
Aravind R. Yarram

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.

0
Bert F