java - 从 Java 14 开始,@Serial 注释的用途是什么

标签 java serialization deserialization java-io java-14

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

Indicates that an annotated field or method is part of the serialization mechanism defined by the Java Object Serialization Specification.


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

So if it should be the whole picture, add them all: @Serializable, @NotSerializable, @Transient and make Serializable deprecated…


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

最佳答案

What I don't understand, does the annotation affect the de/serialization itself


不,它的保留是'源',所以它在编译后被丢弃。字节码将不包含任何痕迹。它无法影响运行时行为(除了可能不会发生的编译时代码生成)。
点赞@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 个字段)的描述完全匹配。如果方法的签名不匹配,或者修饰符错误,您将在运行时序列化失败之前发现问题。

关于java - 从 Java 14 开始,@Serial 注释的用途是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63783474/

相关文章:

java - 为什么 Object.hashCode() 不遵循 Java 代码约定

c# - 使用 Newtonsoft.json 自定义反序列化

java - Jackson 反序列化 JSON,跳过没有必填字段的对象?

java - JSF+Facebook 集成应用程序的设置不允许一个或多个给定的 URL。它必须与网站 URL 或 Canvas URL 匹配

java - 基于JTextField过滤JList

c++ - Cereal:序列化多态类型

python - 将字符串转换成字典

c# - 在 MVC 中将 JSON 字符串转换为 JsonResult

java - 为什么我在访问字符串时得到 "error : expected ;"?

django - 按子字段对嵌套序列化器字段的 DRF 序列化器输出进行排序