10

クラスをシリアライズ可能にするには、次のようにします。

class A implements Serializable {
    transient Object a;
}

そしてこれではありません:

serializable class A {
   transient Object a;
}

クラスをシリアライズ可能にしたい場合、特別なインターフェースを実装する必要があるのはなぜですか。一部のフィールドを除外したい場合は、キーワード transient?を使用します。どちらの場合も特別なキーワードが使用されないのはなぜですか? 同じものを違う方法で作る理由があったということですか?私は知っています、そのようなキーワードはありませserializableんが、なぜ特別なインターフェースの代わりに導入されなかったのSerializableですか?

4

5 に答える 5

28

クラスをシリアライズ可能としてマークするために特別なキーワードを使用しないのはなぜですか? シリアル化可能なインターフェイスは、コード内のマジック ナンバーのように見え、言語機能とは異なります。

別の見方をする必要があると思います。言語キーワードは、主にコンパイル時の言語構造をサポートするために存在します。シリアル化はランタイム メカニズムです。さらに、識別子として使用できないため、すべてに追加のキーワードを使用する必要はありません。一方、マーカー インターフェースはそれほど邪魔になりません。

したがって、問題は、一時的なフィールドをマークするために言語キーワードが必要な理由です。その答えは、当時、特定のフィールドをマークする方法が他になかったということです。

今日では、両方の場合でこの目的のために注釈を使用します (また、obscurestrictfpキーワードなどの他のものにも使用します)。

于 2009-12-17T16:33:41.750 に答える
4

Serializableマーカーインターフェースです。インターフェースは、クラスの機能を示す標準的な方法です (Java およびその他の言語で)。「ある」関係。インターフェイスを作成するということは、他のインターフェイスで動作するメソッドと同じように、 sSerializableを受け取ったり返したりするメソッドを宣言できることを意味します。Serializableそれ以外の場合は、言語の構文を変更する必要がありました (当時、現在は注釈がありますが、インターフェイスは引き続き使用されると思います)。

于 2009-12-17T16:29:42.377 に答える
1

SerializableCloneableは、そのクラスのデザイナーに従ってオブジェクトをシリアライズできる標準 Java ランタイム ライブラリ コードのフラグを設定するために使用されるマーカー インターフェイス ( など) です。

このtransientキーワードを使用して、属性をシリアライズする必要がないことを指定できます。たとえば、派生属性であるためです。

SO に関する同様の質問に対するこの回答と、マーカーインターフェイスの設計に関するこの質問も参照してください。

アップデート

シリアライズ可能、クローン可能などのマーカーインターフェイスとキーワードがないのはなぜですか? 私の推測では、動作面が言語に組み込まれた場合、Java ランタイム lib を一貫して拡張し、新しいマーカー インターフェイスと非常に多くのキーワードを組み合わせて使用​​できる可能性があります。

クラス属性がインターフェイスを実装できず、属性の一般的なプロパティと見なすことができるという事実は、言語キーワードとしてtransient導入することに意味があります。transient

于 2009-12-17T16:35:07.677 に答える
0

では、クラスをシリアル化できない (一時的なメンバーのように) とマークできない理由を尋ねていますか? シリアル化しない型のクラス メンバーを一時的なものとしてマークしないのはなぜですか? または、シリアライゼーションを行うときに、そのクラス タイプのシリアライゼーション デリゲートを使用しますか? Java に何かをするように指示するのではなく、このレベルで何かをないように Java に指示したいというのは、少し奇妙に思えます。

于 2009-12-17T16:32:11.193 に答える
0

一時的なキーワードは、変数またはフィールドが保存されないように保護するために使用されます。これは、すべての場所に配布したくない機密情報を保護するために行います。また、Serializable インターフェイスを使用して、クラスを Serializable にします。Externalizable インターフェイスも使用できますが、いくつかの利点があるため、Serializable を使用することをお勧めします。

これを読んで、シリアライゼーションと一時的なキーワードを明確に理解してください。 http://www.codingeek.com/java/io/object-streams-serialization-deserialization-java-example-serializable-interface/

于 2014-12-10T08:09:39.447 に答える