首页 > 解决方案 > 从 Java 14 开始,@Serial 注释的用途是什么

问题描述

@SerialJava 14在java.io包中引入了一个新注解。API 文档中的简要说明:

指示带注释的字段或方法是Java 对象序列化规范定义的序列化机制的一部分。

据我了解,注释用于编译时验证(类似于@Override),以检查是否正确使用了序列化机制方法和字段。我不明白的是,只要它是序列化机制的一部分,注释是否会影响反序列化本身?还是按照此评论建议的方式改进反序列化功能设计的第一步?

因此,如果它应该是整个图片,请将它们全部添加:@Serializable、@NotSerializable、@Transient 并弃用 Serializable...</p>

我对它的使用感到困惑,我还没有找到任何使用它的代码。您是否会提供一个示例代码来突出显示未使用但应该使用注释时的问题?

标签: javaserializationdeserializationjava-iojava-14

解决方案


我不明白的是,注释是否会影响反序列化本身

不,它的保留是'源',所以它在编译后被丢弃。字节码将不包含任何痕迹。它无法影响运行时行为(除了可能不会发生的编译时代码生成)。

就像@Override,它是可选的,并且应该为在运行时可能不会被捕获的问题提供一些编译时保证。

例如,拼写错误serialVersionUID

@Serial
private static final long seralVersionUID = 123L; // compile-time error, should be 'serialVersionUID'

或者错误的访问修饰符

// compile-time error, must be private 
@Serial
public void writeObject(java.io.ObjectOutputStream out) throws IOException

基本上,带有注释的内容必须与 JavaDoc 中提到的 7 个适用元素(5 个方法,2 个字段)的描述完全匹配。如果方法的签名不匹配,或者修饰符错误,您将在运行时序列化失败之前发现问题。


推荐阅读