Module java.base
Package java.io

Annotation Interface Serial


@Target({METHOD,FIELD}) @Retention(SOURCE) public @interface Serial
表示被注解的字段或方法是由 Java对象序列化规范 定义的序列化机制的一部分。此注解类型旨在允许在编译时检查与序列化相关的声明,类似于 Override 注解类型启用的检查以验证方法覆盖。鼓励 Serializable 类使用 @Serial 注解来帮助编译器捕捉错误声明的与序列化相关的字段和方法,这些错误声明可能很难检测到。

具体来说,应该将此类型的注解应用于声明为 Serializable 的类中与序列化相关的方法和字段。五个与序列化相关的方法是:

  • private void writeObject(java.io.ObjectOutputStream stream) throws IOException
  • private void readObject(java.io.ObjectInputStream stream) throws IOException, ClassNotFoundException
  • private void readObjectNoData() throws ObjectStreamException
  • 任意访问修饰符 Object writeReplace() throws ObjectStreamException
  • 任意访问修饰符 Object readResolve() throws ObjectStreamException
与序列化相关的两个字段是:
  • private static final ObjectStreamField[] serialPersistentFields
  • private static final long serialVersionUID
鼓励编译器验证带有 @Serial 注解的方法或字段是否是在有意义的上下文中声明的定义的与序列化相关的方法或字段之一,并在不是这种情况下发出警告。

将此注解应用于其他字段或方法,包括以下情况,是语义错误:

  • 不是 Serializable 的类中的字段或方法
  • 在正确的结构声明中的字段或方法,但在它们无效的类型中。例如,enum 类型被定义为具有 0LserialVersionUID,因此在 enum 类型中声明的 serialVersionUID 字段将被忽略。上面标识的五个与序列化相关的方法对于 enum 类型同样会被忽略。
  • Externalizable 类中:
    • writeObjectreadObjectreadObjectNoData 的方法声明
    • serialPersistentFields 的字段声明
    虽然 Externalizable 接口扩展了 Serializable,但上述三个方法和一个字段在可外部化类中 不会 被使用。
请注意,序列化机制通过反射访问其指定的字段和方法,这些字段和方法在 Serializable 类中可能看起来没有被使用。
自:
14
外部规范
参见: