Рубрики
Без рубрики

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

Узнайте, как применить аннотацию @Serial в Java 14, чтобы помочь при проверке во время компиляции сериализуемых свойств класса.

Автор оригинала: 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 .