3

类注释会影响其默认序列化吗?Java 文档

注解不会直接影响程序语义,但会影响工具和库处理程序的方式,进而影响正在运行的程序的语义。可以从源文件、类文件或在运行时反射地读取注释。

这会让我猜不是,但我还没有找到一个结论性的陈述。

编辑:我的意思是问“注释会影响Java默认序列化吗?” 因此,我正在更改问题文本并接受不太受欢迎的答案。我向回答我之前提出的问题的人道歉(“注释会影响序列化吗?”)。:) 是的,您可以构建影响序列化的案例。但是,我认为更改后的问题将更具实用价值,当然对我来说。

4

2 回答 2

2

可以构建一个基于运行时注释以不同方式序列化的类。

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发生这种情况是因为您引用的“可以反过来影响正在运行的程序的语义”的注释。

于 2012-10-23T17:49:01.623 回答
1

带有的注释RETENTION=RUNTIME是字节码,但本身没有序列化。序列化适用于对象字段,而不适用于类。

序列化程序可以使用注释。但是,标准的 java 序列化机制不使用它们:它是为 java 1.0 创建的,比注解早了 10 年。

但是,自定义机制可以使用注释。例如,您可以创建@Transient注释并使用它来标记不应序列化的字段。

可以使用writeObject()方法或使用第三方库(如 xstream)自定义序列化。

有很多序列化库。您可以将 JAXB 或 XStream 视为将对象序列化为 XML 的库。两者都支持大量注释。

于 2012-10-23T17:55:02.687 回答