2011-12-27 4 views
36

Новое на Java. Изучайте его во время работы над Android-приложением. Я реализую компаратор для сортировки списка файлов и андроид документы say, что компаратор должен реализовать Serializable:Зачем компаратору реализовать Serializable?

Рекомендуется, чтобы компаратор реализует Serializable.

Это интерфейс Serializable here.

Я просто хочу отсортировать список файлов. Почему я должен реализовать это или что даже является причиной, почему это должно быть для любого компаратора?

+0

Почему Android не заботится о сериализации вообще? – irreputable

+2

@irreputable: Почему бы вам не использовать сериализацию на Android? – Thilo

ответ

47

Это не только Android вещь, Java SDK has the same recommendation:

Примечание: Как правило, это хорошая идея для компараторов также осуществлять java.io.Serializable, так как они могут быть использованы в качестве методы упорядочения в сериализуемых структурах данных (например, TreeSet, TreeMap). Чтобы структура данных была успешно сериализована, компаратор (если предоставлен) должен реализовать Serializable.

Таким образом, идея состоит в том, что TreeMap является сериализуемым, а TreeMap может содержать Компаратор, было бы хорошо, если бы Компаратор был также сериализуемым. То же самое относится ко всем элементам коллекции.

Вы можете смело игнорировать это, если вы не используете сериализацию таким образом.

9

Это должно помочь вам: http://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html

Примечание: Это, как правило, хорошая идея для компараторов для реализации java.io.Serializable, так как они могут быть использованы в качестве упорядочения методов в сериализуемых структур данных (как TreeSet, TreeMap). Чтобы структура данных была успешно сериализована, компаратор (если предоставлен) должен реализовать Serializable.

8

Serializeable - пустой интерфейс. Он не содержит никаких методов. Итак, чтобы реализовать его, все, что вам нужно сказать, это implements Serializable в классе. Это не огромная нагрузка на вас. Если вы расширяете Comparator, вам даже не нужно реализовывать Serializable, потому что суперкласс делает это за вас, а затем вам не нужно ничего делать, чтобы реализовать Serializable.

Когда что-то реализует Serializable, это означает, что объект может быть преобразован в массив байтов по желанию. Это используется для передачи через Интернет, хранения в файле и т. Д. Говоря очень грубо, способ сериализации для объекта по умолчанию состоит в том, чтобы взять каждый объект, на который ссылается объект, который вы пытаетесь сериализовать, объект в массив байтов (т. е. вызывать сериализацию на нем рекурсивно) и объединить байтовые массивы для создания массива байтов, который представляет общий объект.

Теперь, зачем следует использовать ComparatorSerializable? Предположим, вы хотите сериализовать TreeMap или некоторые другие, заказанные Collection. Целью сериализации является предоставление полного представления объекта.В таких коллекциях, как TreeMap, есть объект Comparator, поэтому для создания массива байтов, который захватывает каждый аспект таких коллекций, вы должны также сохранить Comparator в качестве байтового массива. Следовательно, Comparator должен быть Serializable, так что другие вещи могут быть правильно сериализованы.

+3

«Если вы расширяете компаратор»: Компаратор является интерфейсом (и не расширяет Serializable). «чтобы реализовать это, все, что вам нужно сказать, - это реализовать Serializable в классе», вам также нужно подумать, правильно ли это делать. например, все поля экземпляров также должны быть сериализуемыми (или вам необходимо принять некоторые меры). – Thilo

0

я видел в Java 5 API Link to java 5 APT , который заявил, что реализация компаратора не означает, что для реализации Serializable интерфейса в любом случае, поэтому нужно явно обратить внимание, чтобы получить Сериализуемые в каком-то обычно созданном классе Comparator

3

Для сериализации объекта в Java оба эти условия должны быть выполнены:

  1. Класс, к которому должен принадлежать экземпляр, должен реализовать java.io.Serializable.
  2. Члены класса должны быть сериализованы. Если один или несколько членов не должны быть сериализованы, они должны быть отмечены как переходные.

Если какая-либо структура данных использует компаратор и вы хотите, чтобы структура данных была сериализована, точка 2 (упомянутая выше) заставляет компаратор реализовывать сериализуемое.

Смежные вопросы