つくねの手帳

C++およびAndroidアプリ開発メインで何か書きたい

Java覚書:Serializable

  • java.io.Serializableインターフェース

Javaでは、DBへの保存やファイル出力を行う際に、java.io.Serializableインターフェースを実装したクラスを使います。
このインターフェースを実装することで、シリアライズ/デシリアライズが可能になります。実装していない場合はシリアライズ/デシリアライズされることはありません。

例:

import java.io.Serializable;

public class SampleData implements Serializable {
  private static final long serialVarsionUID = 1L;

  private String name;

  public String getName(){
    return name;
  }

  public void setName(String data){
    name = data;
  }
}

このインターフェース、上の例を見てもわかる通り、オーバーライドするべき関数はありませんし、フィールドもありません。
単純に、シリアライズ/デシリアライズが可能であることを示すための宣言として機能します。

注意事項として、内部に持つフィールドは、プリミティブ型もしくはシリアライズ可能なクラスである必要があります。

  • シリアルバージョンID

例のクラスに書かれている、

private static final long serialVarsionUID = 1L;

この定義はシリアルバージョンIDで、シリアライズ/デシリアライズの前後でクラスのバージョンが異なっていないかを識別するために定義しています。
serialVersionUIDを定義しておくことで、バージョンが不一致の際にInvalidClassExceptionの例外を投げてくれます。
明示的に宣言をしていない場合でもデフォルト値を計算してくれますが、コンパイラの実装次第で予期しない不一致が発生する可能性があります。
コンパイラが異なっても一貫性を保つために、明示的に宣言することが推奨されています。