13
public class Foo implements java.io.Serializable {
   private int v1;
   private static double v2;
   private Loan v3 = new Loan();
}

オプション:
A。FooはSerializableを実装しているため、Fooのインスタンスをシリアル化できます。
B. Fooにはシリアル化できないインスタンス変数v3が含まれているため、Fooのインスタンスをシリアル化できません。
C. v3を一時としてマークすると、Fooのインスタンスはシリアル化可能になります。
D.bおよびc

回答:D

java.io.Serializable説明:オブジェクトには、シリアル化できないインスタンス変数が含まれている可能性があるため、そのクラスがを実装していても、オブジェクトはシリアル化されない場合があります。

今私の質問は:

私の知る限り、シリアル化をオフにするためにトランジェントが使用されます。では、この場合、どのように一時的であり、fooをシリアル化するのに役立ちますか?

4

3 に答える 3

23

transientシリアル化を完全に無効にするわけではありません。シリアル化されないメンバーをマークするだけです。通常、オブジェクトがシリアル化されていない場合に正しくないか無関係なもの、または保存するのが安全ではないもの (パスワード、復号化されたデータなど)、またはシリアル化できない可能性のあるものに使用されます。簡単に再構築できます。

この場合、Loanクラスはシリアライズ可能ではないと仮定します。(そうであれば、A が正しいでしょう。)v3トランジェントとしてマークすることは、Java にそのフィールドを気にしないように指示するだけですが、先に進んで他のフィールドをシリアライズします。これは、シリアル化されFooていないものが null を持つ可能性があることを意味しますv3。も保存したい場合はLoan、必要に応じて再作成するのに十分な情報を追跡するか、Loan実装するようにクラスを変更する必要がありjava.io.Serializableます。

または、シリアル化を制御する必要がある場合は、実装できるメソッド ( writeObject、 ) があります。readObjectしかし、それは少し面倒かもしれません。

于 2011-03-03T05:46:50.923 に答える
2

では、この場合、foo をシリアライズするのに役立つ一時的なものはどのようになっているのでしょうか?

Fooの残りの部分、つまりシリアライズ可能な他のメンバーをシリアライズできるからです

于 2011-03-03T06:19:43.433 に答える
0

まず、Loan がシリアライズ可能でないことは確かですか? その場合、B は適用されません。

一方、そうでない場合は、B と C が正しいです。transient通常はシリアライゼーションをオフにしませんが、関連付けられているフィールドに対してのみオフにします。したがって、Foo をシリアライズしても、v3 フィールドの値は送信されません。受信側で Foo インスタンスを再初期化するとき、シリアル化メカニズムはストリームからそのフィールドを読み取ろうとせず、null のままにします。

于 2011-03-03T05:46:36.523 に答える