ActiveJ学习心得——serializer(7)

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轻量级的观念。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值