模块 java.base
 java.io

注解串行


@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
  • ANY-ACCESS-MODIFIER Object writeReplace() throws ObjectStreamException
  • ANY-ACCESS-MODIFIER Object readResolve() throws ObjectStreamException
两个序列化相关的字段是:
  • private static final ObjectStreamField[] serialPersistentFields
  • private static final long serialVersionUID
鼓励编译器验证标有 @Serial 注释的方法或字段是否是在有意义的上下文中声明的定义的序列化相关方法或字段之一,如果不是这种情况则发出警告。

将此注释应用于其他字段或方法是语义错误,包括:

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