类注释会影响其默认序列化吗?Java 文档说
注解不会直接影响程序语义,但会影响工具和库处理程序的方式,进而影响正在运行的程序的语义。可以从源文件、类文件或在运行时反射地读取注释。
这会让我猜不是,但我还没有找到一个结论性的陈述。
编辑:我的意思是问“注释会影响Java默认序列化吗?” 因此,我正在更改问题文本并接受不太受欢迎的答案。我向回答我之前提出的问题的人道歉(“注释会影响序列化吗?”)。:) 是的,您可以构建影响序列化的案例。但是,我认为更改后的问题将更具实用价值,当然对我来说。
类注释会影响其默认序列化吗?Java 文档说
注解不会直接影响程序语义,但会影响工具和库处理程序的方式,进而影响正在运行的程序的语义。可以从源文件、类文件或在运行时反射地读取注释。
这会让我猜不是,但我还没有找到一个结论性的陈述。
编辑:我的意思是问“注释会影响Java默认序列化吗?” 因此,我正在更改问题文本并接受不太受欢迎的答案。我向回答我之前提出的问题的人道歉(“注释会影响序列化吗?”)。:) 是的,您可以构建影响序列化的案例。但是,我认为更改后的问题将更具实用价值,当然对我来说。
可以构建一个基于运行时注释以不同方式序列化的类。
public class Foo implements Externalizable {
public void writeExternal(ObjectOutputStream out) throws IOException {
if (getClass().getAnnotations().length == 0) {
out.writeObject("no");
} else {
out.writeObject("yes");
}
}
public void readExternal(ObjectInputStream in) throws IOException { ... }
}
然后具有运行时注释的子类的实例将与父类不同地序列化,尽管事实上writeExternal是共享的。
@Retention(RetentionPolicy.RUNTIME)
@interface ARuntimeAnnotation {}
@ARuntimeAnnotation
public class SubFoo extends Foo {}
RetentionPolicy.RUNTIME发生这种情况是因为您引用的“可以反过来影响正在运行的程序的语义”的注释。
带有的注释RETENTION=RUNTIME是字节码,但本身没有序列化。序列化适用于对象字段,而不适用于类。
序列化程序可以使用注释。但是,标准的 java 序列化机制不使用它们:它是为 java 1.0 创建的,比注解早了 10 年。
但是,自定义机制可以使用注释。例如,您可以创建@Transient注释并使用它来标记不应序列化的字段。
可以使用writeObject()方法或使用第三方库(如 xstream)自定义序列化。
有很多序列化库。您可以将 JAXB 或 XStream 视为将对象序列化为 XML 的库。两者都支持大量注释。