Java: comment assurer serializable collections
En Java, la Collection d'interfaces ne s'étendent pas Sérialisable pour plusieurs bonnes raisons. En outre, la plupart des communes des implémentations de ces interfaces à implémenter Serializable.
Telle sorte que les objets qui implémentent l'un de la Collection-les interfaces sont sérialisables si l'application elle-même est sérialisable (ce qui est généralement le cas) et si les objets de la collection sont toutes serializable.
Mais comment puis-je m'assurer que ces deux conditions sont remplies? Je ne veux pas courir dans l'exécution, erreur, puisque le compilateur a pu vérifier ces conditions. Je suis en train de réfléchir certains évident interface comme (vitrine de la Liste de l'interface):
public interface SerializableList<T extends Serializable> extends Serializable, List<T> {}
Je me demandais si personne n'est confronté à ce problème et est venu avec cette solution de facilité. Jusqu'à maintenant, je n'ai pas pu trouver une solution ou même une discussion sur ce qui me fait douter sur mon idée.
List
référence - List<T extends Serializable>
, si je comprends bien votre question correctement. Vous n'avez pas besoin de déployer votre propre interface.Le compilateur ne peut pas vérifier. Chaque classe d'exécution Sérialisable pourrait contenir un non transitoires, non sérialisable champ, ce qui conduirait à une exception d'exécution. Et une ArrayList<Object> peut-être sérialisable si les objets qu'il contient sont sérialisables. Si c'est vraiment important, l'utilisation des tests unitaires.
Votre proposition ne garantit que les objets de la liste sont sérialisables, mais pas la Liste-la mise en œuvre elle-même.
Vous n'avez pas me rattraper. Même un
ArrayList<Serializable>
ne pouvait pas être sérialisable. ArrayList est Sérialisable. Il ne contient que des instances de Serializable. Mais dès que l'un de ces objets contenus contient un non sérialisable domaine, il n'est pas sérialisable plus. Quel que soit le nombre de génériques limites que vous ajoutez, vous pouvez avoir des erreurs lors de l'exécution. Donc, utiliser des tests.Oui. Et à l'aide d'un non-sérialisable collection quand vous le voulez serializable est aussi un bug. Repérer les bugs par l'écriture de tests.
OriginalL'auteur MrD | 2013-07-23
Vous devez vous connecter pour publier un commentaire.
Ce que vous demandez est une définition de type de la liaison de deux types:
<type-def> a = null;
Ce que vous avez besoin est un remplacement de
<type-def>
avec un cahier des charges, faire en sorte que l'objet référencé para
implémente à la foisSerializable
ainsi queCollection<? extends Serializable>
. Une telle définition de type n'est pas pris en charge par le langage Java.Que vous avez déjà écrit, la solution la plus évidente peut-être à déclarer votre propre interface, l'adhésion à ces deux autres interfaces:
interface SerializableCollection<T extends Serializable> extends Collection<T>, Serializable {}
Semble ok, jusqu'à ce que vous essayez quelque chose comme ceci:
SerializableCollection<String> a = new ArrayList<String>();
Ce ne sera cependant pas compiler. Même si
ArrayList<String>
implémente à la foisCollection<? extends Serializable>
etSerializable
, la classe n'implémenteSerializableCollection<String>
.Maintenant, vous pouvez si vous le voulez bien, contourner même ce problème en déclarant une nouvelle classe:
SerializableArrayList<T extends Serializable> extends ArrayList<T> implements SerializableCollection<T> {}
Maintenant, vous avez essentiellement combiné tout ce dont vous avez besoin et serait en mesure de répondre à l'exigence de départ:
SerializableCollection<String> a = new SerializableArrayList<String>();
Est-il encore la peine? Dans votre cas, vous devez décider, mais je dirais que non. Mon argument est que, depuis la
Serializable
marqueur est juste un non-formel "étiquette", en assurant que les deux de votre collection et de son contenu, de mettre en œuvreSerializable
encore ne garantit pas que le contenu en fait peut être sérialisé.Serializable
-interface sont vraiment serializable (c'est dommage). Je pense que c'est le point: est-il encore la peine? Je vais y réfléchir si c'est applicable dans mon cas.OriginalL'auteur jarnbjo
Serializable
n'est pas une bonne interface. Il doit avoir été une annotation, si ceux-ci étaient disponibles quand il a été mis en œuvre.Comment voulez-vous gérer un
List
d'unList
de quelque chose de pasSerializable
. Vous auriez besoin pour s'assurer qu'aucun objet n'est pas serialisable transitivement en bas de l'objet graphique. Pas tous les objets qui implémententSerializable
peut effectivement être sérialisé.interface SerializableCollection<T extends Collection<? extends Serializable>>{}
peut quelque chose comme cela se fait?Un
List
des objets qui ne sont pasSerializable
ne peut pas être ajouté à laSerializableList
depuis cetteList
ne pas mettre en œuvreSerializable
. Bien sûr, je pourrais ajouter unArrayList
(qui est sérialisable) contenant quelques pas des objets sérialisables - mais seulement si je l'utilise comme matières premières de type. Si elle est paramétrée, le compilateur devrait se plaindre à ce sujet.Ok, je l'ai maintenant. Avec
ArrayList
il est possible d'ajouter non des objets sérialisables qui conduisent à l'exécution des erreurs. Voir les commentaires sur la question.OriginalL'auteur Tom Hawtin - tackline
Une approche de clonage d'une collection et objets contenus est
(par exemple, à l'aide de ArrayList<Type>(collection) parce que SerializationUtils besoin de l'interface Serializable)
Ce qui concerne,
Gunnar
OriginalL'auteur Gunnar