Автор оригинала: Donato Rimenti.
1. введение
В этом кратком руководстве мы рассмотрим новую аннотацию @Serial , представленную в Java 14.
Аналогично @Override , эта аннотация используется в сочетании с флагом serial lint для выполнения проверок во время компиляции для связанных с сериализацией членов класса .
Хотя аннотация уже доступна в соответствии со сборкой 25, проверка ворса еще не выпущена.
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 :
- когда класс не реализует Сериализуемый интерфейс:
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 .