web-dev-qa-db-ja.com

なぜコンパレータはSerializableを実装する必要があるのですか?

Javaの新機能。 Androidアプリで作業中にそれを学びます。ファイルのリストとAndroid docs say コンパレータがSerializableを実装する必要があること:

コンパレータがSerializableを実装することをお勧めします。

これはSerializableインターフェース here です。

ファイルのリストを並べ替えるだけです。なぜこれを実装する必要があるのですか、それがどのコンパレータにも必要なのはなぜですか?

39
Bjorn

これは単なるAndroid事ではありません Java SDKにも同じ推奨事項があります

注:コンパレーターは、Java.io.Serializableも実装することをお勧めします。これは、コンパレーターが直列化可能なデータ構造(TreeSet、TreeMapなど)の順序付けメソッドとして使用される可能性があるためです。データ構造を正常にシリアル化するには、コンパレータ(提供されている場合)がSerializableを実装する必要があります。

つまり、TreeMapはシリアル化可能であり、TreeMapにコンパレータを含めることができるため、コンパレータもシリアル化可能であることが理想です。同じことがコレクション内のすべての要素に適用されます。

この方法でシリアル化を使用しない限り、これを無視しても問題ありません。

50
Thilo

Serializeableは空のインターフェイスです。メソッドは含まれていません。したがって、それを実装するために言う必要があるのはimplements Serializableクラス内。それはあなたにとって大きな負担ではありません。 Comparatorを拡張する場合、スーパークラスが代わりにSerializableを実装する必要はなく、Serializableを実装するために何もする必要はありません。

何かがSerializableを実装する場合、それはオブジェクトを自由にバイト配列に変換できることを意味します。これは、インターネットを介した送信、ファイルへの保存などに使用されます。大まかに言えば、オブジェクトのシリアル化の動作は、デフォルトでは、シリアル化しようとしているオブジェクトが参照するすべてのオブジェクトを取得し、それぞれを順番にすることですオブジェクトをバイト配列に入れ(つまり、シリアライズを再帰的に呼び出します)、バイト配列を連結して、オブジェクト全体を表すバイト配列を生成します。

では、なぜComparatorSerializableを実装する必要があるのでしょうか。 TreeMapまたはその他の順序付けられたCollectionをシリアル化したいとします。直列化の目的は、オブジェクトの完全な表現を提供することです。 TreeMapのようなコレクションにはComparatorオブジェクトが含まれているため、このようなコレクションのあらゆる側面をキャプチャするバイト配列を生成できるようにするには、Comparatorをバイト配列として保存する必要もあります。したがって、ComparatorSerializableにする必要があります。これにより、他のものを適切にシリアル化できます。

9
Gravity

これはあなたを助けるはずです: http://docs.Oracle.com/javase/7/docs/api/Java/util/Comparator.html

注:コンパレータは、直列化可能なデータ構造(TreeSet、TreeMapなど)の順序付けメソッドとして使用できるため、Java.io.Serializableを実装することをお勧めします。データ構造を正常にシリアル化するには、コンパレータ(提供されている場合)がSerializableを実装する必要があります。

9
Anuj Arora

Javaでオブジェクトをシリアル化するには、次の両方の条件を満たす必要があります。

  1. インスタンスが属するクラスは、Java.io.Serializableを実装する必要があります。
  2. クラスのメンバーはシリアル化可能である必要があります。 1つ以上のメンバーをシリアル化しない場合は、一時メンバーとしてマークする必要があります。

データ構造がコンパレータを使用していて、そのデータ構造をシリアル化可能にしたい場合、ポイント2(上記)は、コンパレータにシリアル化を実装するように強制します。

3
Jaydev

私はJava 5 API Link to Java 5 APT で見ましたが、コンパレータを実装することはSerializableを実装することを意味しないと述べましたいずれにせよインターフェイスなので、習慣的に作成されたComparatorクラスでSerializableを取得するには、明示的に注意を払う必要があります

0
user1094782