1. Introduction
In this quick tutorial, we’ll take a look at the new @Serial annotation introduced with Java 14.
Similarly to @Override, this annotation is used in combination with the serial lint flag to perform compile-time checks for the serialization-related members of a class.
Although the annotation is already available as per build 25, the lint check has yet to be released.
2. Usage
Let’s start by annotating with @Serial any of the seven serialization-related methods and fields:
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;
}
}
After that, we need to compile our class with the serial lint flag:
javac -Xlint:serial MySerialClass.java
The compiler will then check the signatures and the types of the annotated members and issue a warning if they don’t match the expected ones.
Furthermore, the compiler will also throw an error if @Serial is applied:
- when a class is not implementing the Serializable interface:
public class MyNotSerialClass {
@Serial
private static final long serialVersionUID = 1; // Compilation error
}
- where it would be ineffectual – such as any serialization method for an enum*,* since those are ignored:
public enum MyEnum {
@Serial
private void readObjectNoData() throws ObjectStreamException {} // Compilation error
}
- to writeObject(), readObject(), readObjectNoData() and serialPersistentFields in an Externalizable class since those classes use different serialization methods:
public class MyExternalizableClass implements Externalizable {
@Serial
private void writeObject(ObjectOutputStream stream) throws IOException {} // Compilation error
}
3. Conclusion
This short article went through the new @Serial annotation usage.
As always, all the code in the article is available over on GitHub.