web-dev-qa-db-fra.com

Pourquoi un comparateur devrait-il implémenter Serializable?

Nouveau sur Java. Apprendre en travaillant sur une application Android. J'implémente un comparateur pour trier une liste de fichiers et les documents Android --- disons qu'un comparateur doit implémenter Serializable:

Il est recommandé qu'un comparateur implémente Sérialisable.

Ceci est l'interface sérialisable ici .

Je veux juste trier une liste de fichiers. Pourquoi devrais-je implémenter cela ou quelle est la raison pour laquelle cela devrait être pour tout comparateur?

39
Bjorn

Ce n'est pas seulement une chose Android chose, le Java SDK a la même recommandation :

Remarque: C'est généralement une bonne idée pour les comparateurs d'implémenter également Java.io.Serializable, car ils peuvent être utilisés comme méthodes de commande dans des structures de données sérialisables (comme TreeSet, TreeMap). Pour que la structure de données soit sérialisée avec succès, le comparateur (s'il est fourni) doit implémenter Sérialisable.

L'idée est donc que parce qu'un TreeMap est sérialisable et que le TreeMap peut contenir un comparateur, il serait bon que le comparateur soit également sérialisable. Il en va de même pour tous les éléments de la collection.

Vous pouvez ignorer cela en toute sécurité, sauf si vous utilisez la sérialisation de cette manière.

50
Thilo

Sérialisable est une interface vierge. Il ne contient aucune méthode. Donc, pour l'implémenter, tout ce que vous devez dire est implements Serializable dans une classe. Ce n'est pas un énorme fardeau pour vous. Si vous étendez Comparator, vous n'avez même pas besoin d'implémenter Serializable parce que la super classe le fait pour vous, et alors vous n'avez rien à faire du tout pour implémenter Serializable.

Quand quelque chose implémente Serializable, cela signifie que l'objet peut être transformé à volonté en un tableau d'octets. Ceci est utilisé pour la transmission sur Internet, le stockage dans un fichier, etc. En gros, la façon dont la sérialisation fonctionne pour un objet, par défaut, est de prendre chaque objet référencé par l'objet que vous essayez de sérialiser, tournez chacun objet dans un tableau d'octets (c'est-à-dire invoquer la sérialisation de façon récursive) et concaténer les tableaux d'octets pour produire un tableau d'octets qui représente l'objet global.

Maintenant, pourquoi un Comparator devrait-il implémenter Serializable? Supposons que vous souhaitiez sérialiser un TreeMap ou un autre Collection commandé. Le but de la sérialisation est de fournir une représentation complète d'un objet. Les collections comme TreeMap ont un objet Comparator, donc pour pouvoir produire un tableau d'octets qui capture tous les aspects de ces collections, vous devez être en mesure d'enregistrer le Comparator en tant que tableau d'octets également. Par conséquent, Comparator doit être Serializable pour que d'autres éléments puissent être correctement sérialisés.

9
Gravity

Cela devrait vous aider: http://docs.Oracle.com/javase/7/docs/api/Java/util/Comparator.html

Remarque: C'est généralement une bonne idée pour les comparateurs d'implémenter Java.io.Serializable, car ils peuvent être utilisés comme méthodes de commande dans les structures de données sérialisables (comme TreeSet, TreeMap). Pour que la structure de données soit sérialisée avec succès, le comparateur (s'il est fourni) doit implémenter Sérialisable.

9
Anuj Arora

Pour sérialiser un objet en Java, ces deux conditions doivent être remplies:

  1. La classe à laquelle appartient l'instance doit implémenter Java.io.Serializable.
  2. Les membres de la classe doivent être sérialisables. Si un ou plusieurs des membres ne doivent pas être sérialisés, ils doivent être marqués comme transitoires.

Lorsqu'une structure de données utilise un comparateur et que vous souhaitez que cette structure de données soit sérialisable, le point 2 (mentionné ci-dessus) oblige le comparateur à implémenter sérialisable.

3
Jaydev

j'ai vu dans Java 5 API Lien vers Java 5 APT qui a déclaré qu'en implémentant Comparator ne signifie pas implémenter Serializable interface de toute façon, donc il faut explicitement faire attention pour obtenir Serializable dans une classe Comparator créée de façon habituelle

0
user1094782