Перейти к основному содержимому

Руководство по аннотации @Serial в Java 14

· 2 мин. чтения

1. Введение

В этом кратком руководстве мы рассмотрим новую аннотацию @Serial, представленную в Java 14.

Подобно @Override , эта аннотация используется в сочетании с флагом последовательной проверки для выполнения проверок во время компиляции для членов класса, связанных с сериализацией .

Хотя аннотация уже доступна для сборки 25, проверка lint еще не выпущена.

2. Использование

Начнем с аннотирования @Serial любого из семи методов и полей, связанных с сериализацией:

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;
}

}

После этого нам нужно скомпилировать наш класс с флагом serial 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 .