3

Javaシリアライゼーションの概念を学ぶ過程で、私はある時点で戸惑いました。Java シリアライゼーション プロセスでは、シリアライゼーションを防止するために、transient と static の 2 つのキーワードを使用します。インスタンス変数を保存したくない場合は、どのキーワードを使用すればよいでしょうか。どちらもまったく同じです。

Class A implements Serializable{
  private static int x;
  private transient int y;
  private transient static int x;
}

上記のコードでは、3 つのインスタンス変数すべてがシリアル化のプロセスで保存されません。シリアル化を防ぐために適切で推奨されるキーワードはどれですか。2 つのキーワードがほぼ同じ機能を持っているのはなぜですか。シリアル化を防ぐために推奨される宣言方法は何ですか。私が間違っている場合は修正してください。私はまだ学んでいます。

4

4 に答える 4

12

キーワードはstatic、インスタンス変数を静的変数に変換します。副作用は、フィールドがシリアル化されなくなったことです...フィールドではないためです。

静的変数は、クラスの変数です。インスタンス変数は、オブジェクトの変数、またはクラスのインスタンスです。盲目的に一方から他方へ行くことはできません。

インスタンス変数と静的変数に関するチュートリアル ページをお読みください。

transientもちろん、キーワードは使用するのに適したキーワードです。

于 2012-06-14T10:45:16.080 に答える
4

あなたは混乱しています:staticフィールドはインスタンス変数ではなく、クラス全体の変数です。field を宣言することによりstatic同じフィールドがこのクラスのすべてのインスタンス間で共有されます。特定のオブジェクトの一部ではなくなるため、シリアル化されません。

シリアライゼーションのみを具体的に防止するにtransientは、適用されます...

于 2012-06-14T10:44:19.347 に答える
2

一時的 (および JAXB XmlTransient 内) は、データが一時的なものであり、永続的に重要ではないため、永続性の問題に関しては無視する必要があることを意味します。

静的とは、値がクラスレベルに適用されることを意味し、複数のインスタンスに対してシリアライズ/デシリアライズすると、値が衝突するため安全ではなくなります。

于 2012-06-14T10:47:06.553 に答える
0

さて、シリアル化をもう一度定義しましょう。

A serialization is a process in which we persist state of an object.

では、静的変数はオブジェクトの状態の一部ですか?..いいえ、絶対にそうではありません。クラスのすべてのオブジェクト間で共有されるデータです。したがって、明らかに、静的変数はオブジェクトの状態でシリアル化されることは想定されていません。

オブジェクトの状態を永続化できると仮定しましょう。後で、この変数が他のオブジェクト/クラス自体によって変更された場合、およびオブジェクトを逆シリアル化しようとした場合、この静的変数が保持する値は何ですか。衝突があります。

したがって、インスタンス変数がシリアライズされるのを防ぎたい場合は、transient を使用してください。オブジェクトを逆シリアル化すると、デフォルト値で初期化されます。

于 2012-06-14T10:58:10.493 に答える