当前位置: 首页 > 知识库问答 >
问题:

自Java 14起,@Serial annotation的用途是什么

华锦程
2023-03-14

Java14在java.io包中引入了一个新的注释@Serial。它在API文档中的简要描述:

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

据我所知,注释用于编译时验证(类似于重写),以检查序列化机制方法和字段是否正确使用。我不明白的是,只要注释是序列化机制的一部分,它会影响反序列化本身吗?或者,这是按照本文建议的方式改进反序列化功能设计的第一步吗?

因此,如果它应该是整个画面,请将它们全部添加:@Serializable、@NotSerializable、@瞬态并使Serializable弃用...

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

共有2个答案

荣轶
2023-03-14

此注释的存在纯粹是为了更好地进行编译时类型检查。它以这种方式类似于覆盖注释,它的存在纯粹是为了捕获设计意图,因此人类和工具可以使用更多的信息。Override注释不会使方法声明成为对另一个方法声明的重写,这是由语言基于比较超类型中方法和方法之间的名称、签名和可访问性来处理的。重写所做的是断言“我认为这是一个重写,如果我错了,请以编译错误的形式告诉我。”并且它向代码的读者发出通知,说明这个方法对于这个类来说并不是新的。

因为序列化使用“魔法”方法和字段名(像readObject这样的方法不是任何接口的一部分,它们只是被序列化神奇地赋予了意义),并且确定魔法是否有效是棘手的(方法不仅必须具有正确的名称和参数,而且必须具有正确的可访问性和静态性),很容易声明一个您认为应该被序列化使用但序列化不同意的方法。

串行注释允许您做出类似的断言:您希望这是一个神奇的序列化成员(字段和方法),如果它与概要文件不匹配,编译器应该向您发出错误警报。它向读者提供了一个类似的提示,即这个成员将被序列化使用。

大多数开发人员可能不会为应用程序和域代码而烦恼。但是库作者可能会发现它是一种参与更强的类型检查和更好地捕获设计意图的有用方法。

濮阳霄
2023-03-14

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

不。它的保留是“源”,因此在编译后被丢弃。字节码将不包含它的痕迹。它无法影响运行时行为(除了可能发生的编译时代码生成之外,这不会发生)。

与重写类似,它是可选的,并且应该为可能在运行时之前无法捕获的问题提供一些编译时保证。

例如,拼写错误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个字段)的描述完全匹配。如果方法的签名不匹配,或者修饰符错误,您将在运行时序列化失败之前发现问题。

 类似资料:
  • Java14不是LTS。 考虑到6个月版本的新发布系列,8个和11个是LTS,Java14不应该是下一个LTS版本吗? 还是纯粹基于Java架构师来决定他们选择哪一个作为LTS? 我确实在网上搜索了,但找不到答案。

  • 问题内容: 我不了解Java的这一功能。我知道它使编码更容易,有时看起来更整洁,但这的实际用途是什么?相反,我觉得最好显示警告,因为将来任何人在修改代码之前都可以引用它们。这@SuppressWarnings是否提高了编译效率,还是根据任何编码标准? 问题答案: 其他答案已经解释了很多用例,但是我想强调一点, 有时您绝对需要使用它来克服语言本身的局限性,在这些情况下,使用绝对是合法的。 在其他情况

  • 问题内容: java中有什么用? 请解释一下。 问题答案: 可能这个例子会帮助您。

  • 本文向大家介绍sinon.js的用途是什么?,包括了sinon.js的用途是什么?的使用技巧和注意事项,需要的朋友参考一下 SinonJS提供独立的测试间谍,存根和模拟。这是一个我们可以用来创建用于单元测试的对象模拟的库。 间谍-可以用来追踪执行情况的伪造函数。 存根-函数替换,我们可以从中返回所需的内容或使我们的函数以适合我们测试多个场景的方式工作。 嘲笑-假方法 所有这些对象都有助于对我们的代

  • 我试图理解何时应该使用stdio函数。 例如,如果我对有效的执行或,并得到一个短计数,并且为真,我该怎么办? 从我到目前为止所读到的,和是健壮的,并且会阻止和/或重试(如果有锁和/或中断可能发生在较低级别的函数中),所以使用<代码>clearerr()因为或错误将是如此灾难性,以至于没有必要尝试恢复。 另外,只告诉我有错误,而不是错误是什么。

  • 问题内容: 我碰巧看到一个有风格的!in有什么用? 问题答案: 使元素下降到文档中位于其之前的所有浮动元素之下。 您也可以使用或使其仅落在向左或向右浮动的那些元素下方。