java - 从 Java 14 开始,@Serial 注释的用途是什么
问题描述
@Serial
Java 14在java.io
包中引入了一个新注解。API 文档中的简要说明:
指示带注释的字段或方法是Java 对象序列化规范定义的序列化机制的一部分。
据我了解,注释用于编译时验证(类似于@Override
),以检查是否正确使用了序列化机制方法和字段。我不明白的是,只要它是序列化机制的一部分,注释是否会影响反序列化本身?还是按照此评论建议的方式改进反序列化功能设计的第一步?
因此,如果它应该是整个图片,请将它们全部添加:@Serializable、@NotSerializable、@Transient 并弃用 Serializable...</p>
我对它的使用感到困惑,我还没有找到任何使用它的代码。您是否会提供一个示例代码来突出显示未使用但应该使用注释时的问题?
解决方案
我不明白的是,注释是否会影响反序列化本身
不,它的保留是'源',所以它在编译后被丢弃。字节码将不包含任何痕迹。它无法影响运行时行为(除了可能不会发生的编译时代码生成)。
就像@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 个字段)的描述完全匹配。如果方法的签名不匹配,或者修饰符错误,您将在运行时序列化失败之前发现问题。
推荐阅读
- python - 调用存储在类变量中的可调用对象
- modelica - OpenModelica 中非线性求解器的外部函数调用越界
- fatal-error - 找不到编号系统的十进制模式:prestashop 1.7.6
- ios - UITableViewCell 中的平移手势可防止 UITableView 中的滚动。如何解决?
- python - 如果某些目录没有该文件,在 Python 代码库的子目录中添加“__init__.py”有什么缺点?
- gnupg - 将多个 PGP 密钥文件与 gnuPG 合并的最简单方法是什么?
- amazon-web-services - SSH 到 Windows 上的 EC2 实例不起作用
- r - 重新调整 R 中数字总和的值
- spring - ReloadableResourceBundleMessageSource vs ResourceBundleMessageSource - 找不到边界
- mysql - Mariadb UPDATE 从远程客户端非常慢