1. 序章

このクイックチュートリアルでは、Java14で導入された新しい@Serialアノテーションを見ていきます。

@Override と同様に、このアノテーションはシリアルlintフラグと組み合わせて使用され、クラスシリアル化関連メンバーのコンパイル時チェックを実行します。

アノテーションはビルド25に従ってすでに利用可能ですが、lintチェックはまだリリースされていません。

2. 使用法

@Serial で、シリアル化に関連する7つのメソッドとフィールドのいずれかに注釈を付けることから始めましょう。

public class MySerialClass implements Serializable {

    @Serial
    private static final ObjectStreamField[] serialPersistentFields = null;
	
    @Serial
    private static final long serialVersionUID = 1;
	
    @Serial
    private void writeObject(ObjectOutputStream stream) throws IOException {
        // ...
    }
	
    @Serial
    private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException {
        // ...
    }

    @Serial
    private void readObjectNoData() throws ObjectStreamException {
        // ...
    }

    @Serial
    private Object writeReplace() throws ObjectStreamException {
        // ...
        return null;
    }

    @Serial
    private Object readResolve() throws ObjectStreamException {
        // ...
        return null;
    }

}

その後、シリアルlintフラグを使用してクラスをコンパイルする必要があります。

javac -Xlint:serial MySerialClass.java

次に、コンパイラーは、注釈付きメンバーの署名とタイプをチェックし、それらが予想されるものと一致しない場合は警告を発行します。

さらに、 @Serial が適用されると、コンパイラもエラーをスローします。

  • クラスがSerializableインターフェースを実装していない場合:
public class MyNotSerialClass {
    @Serial 
    private static final long serialVersionUID = 1; // Compilation error
}
public enum MyEnum { 
    @Serial 
    private void readObjectNoData() throws ObjectStreamException {} // Compilation error 
}
  • writeObject() readObject() readObjectNoData()serialPersistentFieldsへのExternalizableクラス以降クラスはさまざまなシリアル化メソッドを使用します。
public class MyExternalizableClass implements Externalizable {
    @Serial 
    private void writeObject(ObjectOutputStream stream) throws IOException {} // Compilation error 
}

3. 結論

この短い記事では、新しい@Serialアノテーションの使用法について説明しました。

いつものように、記事のすべてのコードはGitHub利用できます。