transient
を実装していないクラスでキーワードを使用するのは理にかなっていますSerializable
か?
実装していないクラスはSerializable
、ObjectOutputStream
.
transient
を実装していないクラスでキーワードを使用するのは理にかなっていますSerializable
か?
実装していないクラスはSerializable
、ObjectOutputStream
.
いくつかの理由から、一時的なものとしてマークしたい場合があります。すぐに思いつくのは次の2つです。
フィールドのセマンティックな目的を伝えるのに役立ちます。つまり、コードを読んでいる人が変数の意味を理解するのに役立ちます
サードパーティのライブラリは、キーワードを使用する場合があります。たとえば、Google の Gson ライブラリは、Serializable を実装しているかどうかに関係なく、任意のオブジェクトを JSON との間でシリアル化/逆シリアル化できます。この場合、Gson は (デフォルトで) 一時的としてマークされたフィールドをスキップします。
オブジェクトのシリアル化は、Serializable の単純な実装よりも複雑であるため (プロキシについて考えてみてください。プロキシ化されたオブジェクトは Serializable を実装できますが、元のオブジェクトではなく、コードではまだ元のクラスを使用しています)
。オブジェクトのシリアライゼーションまたは (javadoc から):
シリアライゼーションおよびデシリアライゼーション プロセス中に特別な処理を必要とするクラスは、これらの正確なシグネチャを持つ特別なメソッドを実装する必要があります。
private void readObject(java.io.ObjectInputStream stream) throws IOException, ClassNotFoundException;
private void writeObject(java.io.ObjectOutputStream stream) throws IOException
private void readObjectNoData() throws ObjectStreamException;
シリアル化プロセス/メカニズムの詳細については、ObjectOutputStream javadoc を参照してください。
編集:あなたの質問に答えるために、transient はシリアライゼーション コンテキストでのみ使用されるキーワードであるためSerializable
、transient フィールドを持つ not オブジェクトは意味がありません
実装していないクラスは
Serializable
、ObjectOutputStream
.
それは正しくありません。それは . をスローしNotSerializableException
ます。
その理由writeObject()
は、シリアライゼーションとは独立して定義されObject
たSerializable
インターフェースの実装に署名が由来するためです。ObjectOutput
ただし、ObjectOutputStream
署名を変更することはできません。
public interface ObjectOutput {
// ...
void writeObject(Object obj);
}