3

transientを実装していないクラスでキーワードを使用するのは理にかなっていますSerializableか?

実装していないクラスはSerializableObjectOutputStream.

4

5 に答える 5

5

いくつかの理由から、一時的なものとしてマークしたい場合があります。すぐに思いつくのは次の2つです。

  • フィールドのセマンティックな目的を伝えるのに役立ちます。つまり、コードを読んでいる人が変数の意味を理解するのに役立ちます

  • サードパーティのライブラリは、キーワードを使用する場合があります。たとえば、Google の Gson ライブラリは、Serializable を実装しているかどうかに関係なく、任意のオブジェクトを JSON との間でシリアル化/逆シリアル化できます。この場合、Gson は (デフォルトで) 一時的としてマークされたフィールドをスキップします。

于 2015-02-12T04:25:45.800 に答える
2

オブジェクトのシリアル化は、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 オブジェクトは意味がありません

于 2013-08-03T17:07:58.960 に答える
1

実装していないクラスはSerializableObjectOutputStream.

それは正しくありません。それは . をスローしNotSerializableExceptionます。


その理由writeObject()は、シリアライゼーションとは独立して定義されObjectSerializableインターフェースの実装に署名が由来するためです。ObjectOutputただし、ObjectOutputStream署名を変更することはできません。

public interface ObjectOutput {
  // ...
  void writeObject(Object obj);
}
于 2013-08-03T16:53:34.927 に答える