LoginSignup
31
40

More than 5 years have passed since last update.

SerializableとserialVersionUIDについて

Posted at

Serializable

  • Javaのインタフェース
  • シリアライズできることを宣言できる
  • メソッドやフィールドの定義が1つもない(=マーカインタフェース)
    宣言をしているだけで機能が追加されるわけでも何でもない

SerialVersionUID

  • シリアライズを宣言したクラスのバージョンのようなもの
  • IDが同じということは構造が同じであることを保証する
  • 構造が変わった時には変更するべきもの

@SuppressWarnings("serial")

  • 構造の保証をするためには、SerialVersionUIDのバージョンを適切に運用する必要があるが、そのコストが見合わない場合には下記のアノテーションをつけて回避する
  • implements Serializableだけしていると下記の警告がでる

警告がでるサンプル

Person.java
package sample;

import java.io.Serializable;

public class Person implements Serializable {
    public String name;

    public SerializablePerson(String name) {
        this.name = name;
    }
}

オプション(全ての警告を出すため)をつけてコンパイルすると

javac -Xlint SerializablePerson.java

警告がでる
(Eclipse上では設定によっては表示されない(環境設定->Java->コンパイラー->エラー/警告))

日本語
Serializable.java:5: 警告: [serial] 直列化可能なクラスSerializableには、serialVersionUIDが定義されていません
英語(たぶん)
The serializable class Mutter does not declare a static final serialVersionUID field of type long

アノテーションをつけて実行すると出ません。

Person.java
package sample;

import java.io.Serializable;

@SuppressWarnings("serial")
public class Person implements Serializable {
    public String name;

    public SerializablePerson(String name) {
        this.name = name;
    }
}

参考

難解なSerializableという仕様について俺が知っていること、というか俺の理解Add Star
継承することの責任という話がとても為になった

31
40
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
31
40