¿Por qué un Comparator debería implementar Serializable?

4 minutos de lectura

Avatar de usuario de Bjorn
björn

Nuevo en Java. Aprenderlo mientras se trabaja en una aplicación de Android. Estoy implementando un comparador para ordenar una lista de archivos y los documentos de Android decir que un Comparador debe implementar Serializable:

Se recomienda que un Comparator implemente Serializable.

Esta es la interfaz serializable aquí.

Solo quiero ordenar una lista de archivos. ¿Por qué debería implementar esto o cuál es la razón por la que debería ser para cualquier Comparador?

  • ¿Por qué a Android le importaría la serialización?

    – irreputable

    27 de diciembre de 2011 a las 7:27

  • @irreputable: ¿Por qué no usarías la serialización en Android?

    – Thilo

    27 de diciembre de 2011 a las 7:38

Esto no es solo una cosa de Android, el Java SDK tiene la misma recomendación:

Nota: en general, es una buena idea que los comparadores también implementen java.io.Serializable, ya que pueden usarse como métodos de ordenación en estructuras de datos serializables (como TreeSet, TreeMap). Para que la estructura de datos se serialice correctamente, el comparador (si se proporciona) debe implementar Serializable.

Entonces, la idea es que debido a que un TreeMap es serializable y el TreeMap puede contener un Comparator, sería bueno que el Comparator también sea serializable. Lo mismo se aplica a todos los elementos de la colección.

Puede ignorar esto con seguridad a menos que use la serialización de esa manera.

Serializable es una interfaz en blanco. No contiene ningún método. Entonces, para implementarlo, todo lo que necesita decir es implements Serializable en una clase No es una gran carga para ti. si te extiendes Comparatorni siquiera necesita implementar Serializable porque la superclase hace eso por ti, y luego no necesitas hacer nada para implementar Serializable.

Cuando algo implementa Serializable, eso significa que el objeto se puede convertir en una matriz de bytes a voluntad. Esto se utiliza para la transmisión a través de Internet, el almacenamiento en un archivo, etc. Hablando en términos generales, la forma en que funciona la serialización para un objeto, de manera predeterminada, es tomar cada objeto al que hace referencia el objeto que está tratando de serializar, convertir cada uno de ellos objeto en una matriz de bytes (es decir, invoque la serialización recursivamente) y concatene las matrices de bytes para producir una matriz de bytes que represente el objeto general.

Ahora bien, ¿por qué un Comparator implementar Serializable? Digamos que desea serializar un TreeMap o algún otro pedido Collection. El objetivo de la serialización es proporcionar una representación completa de un objeto. Colecciones como TreeMap tener un Comparator objeto en ellos, por lo que para poder producir una matriz de bytes que capture todos los aspectos de tales colecciones, debe poder guardar el Comparator como una matriz de bytes también. Por eso, Comparator necesita ser Serializable para que otras cosas puedan serializarse correctamente.

  • “Si extiende Comparator”: Comparator es una interfaz (y no extiende Serializable). “para implementarlo, todo lo que necesita decir es implementa Serializable en una clase”, también debe pensar si eso es lo correcto. por ejemplo, todos los campos de instancia también deben ser serializables (o debe tomar algunas medidas).

    – Thilo

    27 de diciembre de 2011 a las 7:36

Avatar de usuario de Anuj Arora
Anuj Arora

Esto debería ayudarte: http://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html

Nota: por lo general, es una buena idea que los comparadores implementen java.io.Serializable, ya que pueden usarse como métodos de ordenación en estructuras de datos serializables (como TreeSet, TreeMap). Para que la estructura de datos se serialice correctamente, el comparador (si se proporciona) debe implementar Serializable.

Para serializar un objeto en Java, se deben cumplir estas dos condiciones:

  1. La clase a la que pertenece la instancia debe implementar java.io.Serializable.
  2. Los miembros de la clase deben ser serializables. Si uno o más de los miembros no se van a serializar, deben marcarse como transitorios.

Cuando cualquier estructura de datos usa un comparador y desea que esa estructura de datos sea serializable, el punto 2 (mencionado anteriormente) obliga al comparador a implementar serializable.

he visto en Java 5 API
Enlace a Java 5 APT
que indicó que al implementar Comparator no significa implementar la interfaz Serializable de todos modos, por lo que uno debe prestar atención explícitamente para obtener Serializable en alguna clase de Comparator creada habitualmente

¿Ha sido útil esta solución?