2021SC@SDUSC
一、代码分析内容
本次博客来介绍core-serializer包中最后一个包——annotations包。ActiveJ这个框架是有许多@注释语言的,@注释是它的一个重要组成部分,在使用到serializer这个模块的时候,是经常要使用@注释的,可以从如下的serializer用例中可以看出:
public static class Person {
public Person(@Deserialize("age") int age,
@Deserialize("name") String name) {
this.age = age;
this.name = name;
}
@Serialize
public final int age;
@Serialize
public final String name;
private String surname;
@Serialize
public String getSurname() {
return surname;
}
public void setSurname(String surname) {
this.surname = surname;
}
}
在这个定义的Person类中,就使用了@Deserialize和@Serialize这两个注释,也能看出来@Deserialize和@Serialize的用法。
二、annotations包结构
本次就分析一下annotations包中的CustomAnnotations和其他一些我认为比较重要的注释。
三、代码解读
1.CustomAnnotations类
这个类是保存序列化程序注释实现的类,它是一个与SerializeNullable、
SerializeClass、SerializeFixedSize、SerializeReference、SerializeStringFormat、SerializeVarLength这些类有关的类,换句话说,这个类就是对上述这些类进行注释实现。
public static SerializeNullable serializeNullable() {
return new SerializerNullableImpl();
}
public static SerializeClass serializeClass(Class<? extends SerializerDef> value) {
return new SerializeClassImpl(value);
}
public static SerializeClass serializeClass(Class<?>[] subclasses, String subclassesId, int subclassesIdx) {
return new SerializeClassImpl(subclasses, subclassesId, subclassesIdx);
}
public static SerializeFixedSize serializeFixedSize(int value) {
return new SerializeFixedSizeImpl(value);
}
public static SerializeReference serializeReference() {
return new SerializerReferenceImpl();
}
public static SerializeStringFormat serializeStringFormat(StringFormat stringFormat) {
return new SerializerStringFormatImpl(stringFormat);
}
public static SerializeVarLength serializeVarLength() {
return new SerializerVarLengthImpl();
}
通过上述的代码我们可以看出,各种序列化器的注释实现是要调用它们的Impl方法的。我们通过其中一个方法来看看这个是怎么实现的。
首先是创建了一个内部类SerializeFixedSizeImpl,它继承了 AbstractSerializeAnnotation和SerializeFixedSize。这个内部类内部定义了SerializeFixedSizeImpl方法,只是和一个int类型的value相关。其他几个序列化器Impl方法与这个类似,其中实现的例如SerializeFixedSize等接口会在下面进行介绍。
static final class SerializeFixedSizeImpl extends AbstractSerializeAnnotation implements SerializeFixedSize {
final int value;
SerializeFixedSizeImpl(int value) {
this.value = value;
}
@Override
public int value() {
return value;
}
}
2.Deserialize注释
这个注释我们在上面的实例中见到过,它很简单,就是定义了value()方法,而且是String类型的。它的用法是@Deserialize("name") String name
,对定义的变量名进行反序列化。
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.PARAMETER)
public @interface Deserialize {
String value();
}
3.Serialize注释
这是一个序列化器注释,它定义了基本的一些序列化方法,例如:order()、added()、removed()。它的用法在最上面的实例中也有,就是在定义一个序列化变量或者方法前@Serialize。
@Retention(RetentionPolicy.RUNTIME)
@Target({
ElementType.FIELD,
ElementType.METHOD})
public @interface Serialize {
int DEFAULT_VERSION = -1;
int order() default Integer.MIN_VALUE;
int added() default DEFAULT_VERSION;
int removed() default DEFAULT_VERSION;
}
4.SerializeFixedSize注释
这个就是第一个分析的类中一个SerializeFixedSizeImpl方法实现的,它是定义了一个int类型的value()方法,还有一个int类型的path()数组。
@Retention(RetentionPolicy.RUNTIME)
@Target({
ElementType.FIELD,
ElementType.METHOD,
ElementType.TYPE_USE})
@Repeatable(SerializeFixedSizes.class)
public @interface SerializeFixedSize {
int value();
int[] path() default {};
}
5.SerializeFixedSizes注释
我们在annotations包的结构中可以看出,这里许多类都有类似于SerializeFixedSize和SerializeFixedSizes这样的一对的@interface,其实像SerializeFixedSizes这样的就是定义了一个SerializeFixedSize类型的value()数组。
@Retention(RetentionPolicy.RUNTIME)
@Target({
ElementType.FIELD,
ElementType.METHOD})
public @interface SerializeFixedSizes {
SerializeFixedSize[] value();
}
四、总结
本次博客介绍了annotations包中的几个类,在我们真正使用ActiveJ框架的时候,这些@注释都是必不可少的,了解其中的原理是非常重要的,在写项目时使用这些注释会很大地减少代码的工作量,更符合ActiveJ轻量级的观念。