Java14での@Serialアノテーションのガイド
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で利用できます。