1

重複の可能性:
キーワード「transient」はJavaで何を意味しますか?

transientjavaでキーワードについて読んだ。私が理解したのは?フィールドに使用されました。キーワードを宣言するtransientと、そのフィールドはシリアル化されません。シリアライズ可能は、Javaでフィールドに対していつ発生しましたか?インターフェイスを拡張しないとどうなりSerializableますか?何か間違ったことを言ったら訂正してください。この質問は重複している可能性があります。

  • かんなん
4

3 に答える 3

2

オブジェクトを Java ヒープからフラット ファイルまたはネットワークに転送する場合は、シリアル化が必要です。基本的に、オブジェクトを JVM から取得する必要があり、再作成できるように保存する必要があるときはいつでも。

したがって、シリアル化後にオブジェクトが再度作成されたときにデータを入力する必要がないと思われる変数がある場合は、それを一時的として宣言します。たとえば、オブジェクトの温度。オブジェクトを何らかの方法で再作成した場合、この現在の温度は意味を持たないため、シリアル化のプロセス中にオブジェクトをシリアル化する理由はわかっています。

于 2013-01-18T17:01:39.120 に答える
2

シリアル化から除外するフィールドに使用します。シリアル化は、クラスまたはそのクラス階層内のクラスのいずれかがインターフェイスを実装するクラスにのみ適用されます。たとえば、 をjava.lang.Throwable実装java.io.Serializableしているため、すべてのエラーと例外はそのマーカー インターフェイスを継承します。

于 2013-01-18T17:04:30.527 に答える
1

オブジェクトをシリアル化するときは、を使用しObjectOutputStreamて「書き留める」とObjectInputStream「読み戻す」のに使用します。

通常、Java実装のデフォルトの動作は、シリアル化の「一般的な使用」の多くに十分対応できます。transientキーワードは、変数の値を保存(または復元)したくないことをJVMに指示します。変数を処理するときは特に注意する必要がtransientあります。シリアル化されたインスタンスの復元後、変数はnullになるか、値に一貫性がなくなる可能性があります。シリアル化可能なクラスに追加することをお勧めします

 private void writeObject(java.io.ObjectOutputStream out) throws IOException{
    out.defaultWriteObject();
}

private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException{
    in.defaultReadObject();

    //here do something to re-initialize transient variables

}

このようにして、一時的であると宣言したすべてに対して特別な処理を挿入できます。(シリアル化可能なクラスのコンストラクターは、オブジェクトが読み取られるときではなく、初めて使用するときにのみ呼び出されることに注意してくださいObjectInputStream

シリアル化を伴わない他のすべてのコンテキストでは、transient何も意味しません。

于 2013-01-18T17:15:41.730 に答える