web-dev-qa-db-ja.com

フィールドを一時的なものとしてマークすると、オブジェクトをシリアル化できるようになります。

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を実装していても、オブジェクトをシリアル化できない場合があります。

今私の質問は:

私の知る限り、transientは sed でシリアル化をオフにします。では、この場合、どのように一時的であり、fooをシリアル化するのに役立ちますか?

13
zengr

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

この場合、Loanクラスはシリアル化できないと思います。 (もしそうなら、Aは正しいでしょう。)v3を一時的なものとしてマークすると、Javaはそのフィールドについて心配する必要はありませんが、先に進んで他のフィールドをシリアル化します。これは、シリアル化されていないFooにはnullv3が含まれている可能性があります。Loanも保存する場合は、自由に再作成するのに十分な情報を追跡する必要があります。クラスLoanを変更して、Java.io.Serializableも実装するようにします。

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

21
cHao

では、この場合、どのように一時的であり、fooをシリアル化するのに役立ちますか?

Fooのrestをシリアル化できるため、areシリアル化可能な他のメンバー。

2
user207421

まず、ローンがシリアル化できないことを確認しますか?そうである場合、Bは適用されません。

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

0
Vance Maverick