2013年6月17日月曜日

AndroidのSerializableクラスでのtransient指定の落とし穴

Androidのと付けましたがJava全般の話ですね。
先日Serializableなクラスを継承したクラスの落とし穴という話を書きましたが、またしてもSerializeではまってしまいました。
落とし穴というか自分が無知だっただけなんですが、Serializableクラスでフィールドへtransient指定した場合、宣言と同時に値を入れていてもデシリアライズ時には反映されません。
具体的にはこんな感じ

class S implements Serializable {
    public final int x;
    public transient int t = 20;
    public S(int x) {
        this.x = x;
    }
    public String toString() { return "X=" + x + ",T=" + t; }
}

S s = new S(400);
oout.writeObject(s);
Log.v("LOG", (s + ":オブジェクトを書き込みました"));
ObjectInputStream oinp = new ObjectInputStream(finp);
Log.v("LOG", (oinp.readObject() + ":オブジェクトを読み込みました"));

[結果]
06-18 16:26:18.990: V/N(21976): X=400,T=20:オブジェクトを書き込みました
06-18 16:26:18.990: V/N(21976): X=400,T=0:オブジェクトを読み込みました

初期値で与えているt=20が反映されていません。
デシリアライズ時はコンストラクタも通りませんので気を付けましょう。

0 件のコメント:

コメントを投稿