_Java.util.List
_がSerializable
を実装していないのに、LinkedList
、Arraylist
などのサブクラスが実装しているのはなぜですか?相続の原則に反しているようではありませんか?たとえば、Linkedlistをネットワーク経由で送信する場合は、次のように記述する必要があります。
_new ObjectOutputStream(some inputStream).writeObject(some LinkedList);
_
これまでのところ良好ですが、反対側のオブジェクトを読み取るときは、LinkedList l = (LinkedList)objectInputStream.readObject();
ではなく、明示的にList l = (List)objectInputStream.readObject();
と言う必要があります。書き込み機能をLinkedList
からArrayList
に変更する場合は、読み取り部分も変更する必要があります。 List
を実装するSerializable
があれば問題は解決します。
List
はリストの重要な要件ではないため、Serializable
を実装していません。 List
のすべての可能な実装をシリアル化できるという保証(または必要性)はありません。
LinkedList
およびArrayList
はそうすることを選択しますが、それはそれらの実装に固有です。他のList
実装はSerializable
ではない場合があります。
Listはインターフェースであり、Serializableを拡張することは、Listの実装がすべて直列化可能であることを意味します。
直列化可能プロパティはリスト抽象化の一部ではないため、実装には必要ありません。
List
はユーザー固有のサブクラスでも実装できるため、実装者はSerializable
を実装する必要がない場合があります。シリアライザビリティはList
の主要な責任にも属していないため、2つをリンクする理由はありません。
いいえ。LinkedListは常にリストです。リンクリストを逆シリアル化すると、LinkedListはリストであるため、次のように記述できます。
List l = (List) objectInputStream.readObject();
Lが実際にLinkedListであることは重要ではありません。あなたはリストが欲しかった、そしてあなたはリストを得た。
あなたの質問は誤解に基づいているようです。オブジェクトをシリアル化するには、オブジェクト(またはそのクラス)がSerializable
を実装する必要がありますが、タイプSerializable
(またはいくつかのサブタイプ)の式を使用する必要はありません。 writeObject
メソッドがObject
ではなくSerializable
のパラメーター型を持ち、戻り型がreadObject()
であることは非常に意図的です。
ただし、これらのパラメーターと戻り値の型がSerializable
であっても、特定の実装型を知る必要はありません。
ObjectOutputStream stream = ...;
List myList = ...;
stream.writeObject((Serializable)myList);
そして
ObjectInputStream stream = ...;
List myList = (List) stream.readObject();
現在と同様に機能します(Serializableキャストなし)。
ObjectInputStreamとObjectOutputStreamは、呼び出すときにタイプをまったく気にしません。単に手元のオブジェクトとそのクラスを見るだけです。
架空のThreadList implements List<Thread>
、任意の時点でアクティブなスレッドのリストを含みます。実装はアクティブなスレッドを透過的に参照し、それらに簡単にアクセスできるようにします。そのような実装はシリアライズ可能である必要がありますか(Thread
はシリアライズ可能ではないことを忘れて)?
実装をシリアライズしても安全かどうかを決定するのは、インターフェースを実装する人次第です。 List
は、基本的に* Tタイプのアイテムの順序付けられたコレクションを示すため、あまりにも一般的です。
ListがSerializableを実装/拡張する場合、Listのすべての実装クラス/サブクラスもSerializableであり、常に真であるとは限らないという契約を暗示しています。たとえば、 ForwardingListMultimap のguava-collections実装を見てください。機能的にシリアル化可能である必要はありません。これは、Listがシリアル化可能でないためにのみ可能でした。
Java.util.ListがSerializableを実装していないのはなぜですか...
世界中のすべてのList
実装がSerializable
である必要はないためです。
反対側のオブジェクトを読んでいる間、私たちは明示的に言う必要があります...の代わりに
List l = (List) objectInputStream.readObject();
試しましたか?もしそうなら、私はそれがうまくいくと思うでしょう。