EeBlog(テクニカルブログ)

第33回 直列化と継承

新年あけましておめでとうございます。 今年もJavaワンポイントをよろしくお願いします。

今回のテーマは「直列化と継承」です。

Javaの継承では、サブクラスのインスタンスを作成する際に、まずスーパークラスのコンストラクタが呼ばれます。 では、サブクラスが直列化可能かつスーパークラスが直列化不可能な状況で直列化をしたら、どうなるのでしょうか。

実際の動きを、サンプルで確認していきましょう。 今回、AbstractSportsという抽象クラスにplaceフィールドを作りました。 抽象クラスに対してnew演算子は使えないので、抽象クラスにコンストラクタがあるのを奇妙に思うかもしれませんが、サブクラスを生成するために必要なのです。

(さらに…)

第32回 直列化のカスタマイズ

今回のテーマは「直列化のカスタマイズ」です。

前回、直列化不可能な参照型のフィールドにtransientというフィールド修飾子をつけることで、そのフィールドが直列化の対象外となるという話をしました。 しかし、直列化不可能という理由でtransientをつけたフィールドに対しても、状態を保存しておきたいという場合があります。 このような場合に対応するために、今回は直列化の際に特別な働きをするメソッドを学びます。 具体的には、以下のシグネチャを持つメソッドです。

private void writeObject(java.io.ObjectOutputStream out) throws IOException;

private void readObject(java.io.ObjectInputStream in) throws

IOException,ClassNotFoundException;

(さらに…)

第31回 transient

今回のテーマは「transient」です。

まず「transientとは何ぞや」というところから始めましょう。 transientはJavaの予約語の1つで、フィールド修飾子に分類されます。 transientを付けられたフィールドは、直列化の対象外となります。 では、どのような場合にtransientを使うのでしょうか。

transientを使う場合、2パターン考えられます。 1つは状態を保存する必要のない場合です。 直列化復元の際に初期化したいフィールドが該当します。 もう1つは直列化したいクラスに直列化不可能な参照型のフィールドがある場合です。

(さらに…)