2012-10-23 106 views
3

类注解是否会影响其默认序列化? Java docs注释是否会影响Java的默认序列化?

注释不直接影响程序的语义,但它们确实影响方案是由工具和库处理方式,它可以反过来影响正在运行的程序的语义。注释可以从源文件,类文件中读取,也可以在运行时反射性地读取。

这会让我猜不到,但是我还没有找到确凿的说法。

编辑:我打算问一句“注解是否会影响Java的默认序列化?”所以,我正在改变问题文本并接受不太受欢迎的答案。我向那些回答我之前询问的人道歉(“注解是否会影响序列化?”)。 :)是的,你可以构建影响序列化的案例。但是,我认为改变后的问题对我来说更具实用价值。

回答

1

RETENTION=RUNTIME的注释以字节码形式存在,但未进行序列化。序列化适用于对象字段,不适用于类。

注解可以被序列化器使用。但是,标准的java序列化机制并不使用它们:它是在注释前10年为java 1.0创建的。

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

可以使用writeObject()方法或使用像xstream这样的第三方库来自定义序列化。

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

2

可以构建一个基于运行时注释不同地序列化的类。具有运行时注解会从父类不同的序列,尽管该writeExternal共享的事实,一个子类的

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 { ... } 
} 

,然后实例。

@Retention(RetentionPolicy.RUNTIME) 
@interface ARuntimeAnnotation {} 

@ARuntimeAnnotation 
public class SubFoo extends Foo {} 

这是因为对于RetentionPolicy.RUNTIME注释“可以反过来影响正在运行的程序的语义”为你报价。