这个问题很老了,但由于 preon 的文档非常糟糕,我将尝试回答其中一些问题,因为我最近对此进行了研究。
Preon 分两个阶段工作: 创建一个可以解码您要求它解码的类的 Mega-Codec 运行编解码器
第一阶段由 CodecFactory 类支持,这些类为第二阶段生成 Codec 类。
要注册一个额外的 CodecFactory,您可以像这样调用 preon:
DefaultCodecFactory fact = new DefaultCodecFactory();
CodecFactory someFactory = new DefaultCodecFactory();
CodecFactory[] additional = new CodecFactory[1];
additional[0] = someFactory;
Codec<MyClass> myCodec = fact.create(null, MyClass.class, additional,
new CodecDecorator[0], new BindingDecorator[0]);
MyClass result = Codecs.decode(myCodec, buffer);
只需将 someFactory 替换为您的实际工厂即可。编写实际的工厂比较麻烦,为此您需要实现 create 方法:
public <T> Codec<T> create(AnnotatedElement metadata, Class<T> type,
ResolverContext context) {
Preon 主要通过它的工厂列表来寻找一个知道如何处理你要求它反序列化的类中的每个元素的工厂。所以你需要做的是,根据元数据和类型参数,确定当前要反序列化的类属性是否是你想要支持的。最有可能的是,您想添加一个 @BoundBCD 注释,然后检查类似
metadata.getAnnotation(BoundBCD.class)) != null
对于您要处理的那些情况,您应该返回一个至少实现 Codec 接口的解码方法的 Codec 类(您可能还需要实现 getCodecDescriptor,我制作的那个是从列表编解码器复制和粘贴的)
您将希望使用所有相关参数创建此编解码器,例如,如果您的注释有一个大小字段(或者您从类型大小推断它),您应该在返回它之前在您的编解码器中初始化它,如果它是一个边缘表达式,您应该将该表达式保存在编解码器中进行评估。这样,当您使用编解码器的解码功能时,您实际上将拥有运行所需的所有数据,然后您需要做的就是从 BitBuffer 创建适当类型的对象。