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 .