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をシリアル化するのに役立ちますか?
transient
はシリアル化を完全に無効にするわけではありません。シリアル化されないメンバーをマークするだけです。これは通常、オブジェクトがシリアル化されていないときに正しくないか無関係なもの、保存するのが安全ではないもの(パスワード、復号化されたデータ、そのようなもの)、またはシリアル化できないものに使用されます。簡単に再構築できます。
この場合、Loan
クラスはシリアル化できないと思います。 (もしそうなら、Aは正しいでしょう。)v3
を一時的なものとしてマークすると、Javaはそのフィールドについて心配する必要はありませんが、先に進んで他のフィールドをシリアル化します。これは、シリアル化されていないFoo
にはnullv3
が含まれている可能性があります。Loan
も保存する場合は、自由に再作成するのに十分な情報を追跡する必要があります。クラスLoan
を変更して、Java.io.Serializable
も実装するようにします。
または、シリアル化を制御する必要がある場合は、実装できるメソッド(writeObject
、readObject
)があります。しかし、それは少し面倒かもしれません。
では、この場合、どのように一時的であり、fooをシリアル化するのに役立ちますか?
Fooのrestをシリアル化できるため、areシリアル化可能な他のメンバー。
まず、ローンがシリアル化できないことを確認しますか?そうである場合、Bは適用されません。
一方、実際にそうでない場合は、BとCが正しいです。 transient
は通常、シリアル化をオフにしませんが、関連付けられているフィールドに対してのみオフにします。したがって、Fooをシリアル化しても、v3フィールドの値は送信されません。受信側では、Fooインスタンスを再初期化するときに、シリアル化メカニズムはストリームからそのフィールドを読み取ろうとせず、nullのままにします。