如何解决自Java 14起@Serial注释的用途是什么
Java 14在java.io
包中引入了新的注释@Serial
。其在API文档中的简短说明:
表示带注释的字段或方法是 Java对象序列化规范定义的serialization mechanism的一部分。
据我了解,注释用于编译时验证(类似于@Override
),以检查serialization mechanism方法和字段是否正确使用。我不明白,只要注释是序列化机制的一部分,注释是否会影响反序列化本身?还是按照this comment所建议的方式改进反序列化功能设计的第一步?
因此,如果应该是整个图片,请将它们全部添加:@ Serializable,@ NotSerializable,@ Transient,并建议不要使用Serializable…
我对它的使用感到困惑,我还没有找到任何使用它的代码。您是否可以提供示例代码来突出显示未使用但应该使用注释时的问题?
解决方法
我不理解的注释会影响 反序列化本身
不。它的保留是“源”,因此在编译后将其丢弃。字节码将不包含任何痕迹。它没有办法影响运行时行为(可能还会生成编译时代码,但不会发生)。
像@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个字段)。如果方法的签名不匹配,或者修饰符错误,则在运行时序列化失败之前,您将抓住问题。
,此注释的存在纯粹是为了进行更好的编译时类型检查。它与@Override
注释类似,该注释纯粹是为了捕获设计意图而存在的,以便人工和工具可以使用更多信息。 @Override
批注不会使成为方法声明的替代,该声明由语言根据比较名称,签名以及方法与超类型中的方法之间的可访问性进行处理。 s)。 @Override
所做的是断言:“我认为这是一个替代,如果我弄错了,请以编译错误的形式告诉我。”并向代码读者发出通知,指出该方法在该类中不是新的。
因为序列化使用“魔术”方法和字段名(readObject
这样的方法不是任何接口的一部分,它们只是通过序列化而神奇地赋予了重要性),并且确定魔术是否有效是棘手的(方法不仅必须具有正确的名称和参数,而且还必须具有正确的可访问性和静态性),很容易声明您认为应该用于序列化的方法,但是序列化不能达成共识。
@Serial
注释使您可以进行类似的断言:您希望这是那些魔术序列化成员(字段和方法)之一,并且如果它与概要文件不匹配,则编译器应发出警报。你错了。并向读者提供了类似的提示,即该成员将被序列化使用。
大多数开发人员可能不会为应用程序和域代码而烦恼。但是库作者可能会发现它有用,可以用来进行更强大的类型检查和更好地捕获设计意图。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。