我刚刚开始使用Preon解码来自无线电的配置数据(频道号,频率,模式,频道名称等)。不同的无线电具有不同的无线电格式,通常完全不同。 Preon似乎是完美的解决方案。它的可扩展性。
一个无线电将频率数据放在BCD中(频率的8位数存储在4个字节中)。所以我想我需要在Preon开发一个BCD解码器和编码器。我相信我已经在网上阅读了有关Preon的所有信息,但我不知道如何解决这个问题。
如果您为Preon开发了自定义编解码器,请给我一些如何启动的提示。
答案 0 :(得分:0)
这个问题已经很老了,但是因为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接口的decode方法的Codec类(你可能还需要实现getCodecDescriptor,我制作的那个有复制并粘贴在列表中编解码器)
您需要使用所有相关参数创建此编解码器,例如如果您的注释具有大小字段(或者您从类型大小推断它),您应该在返回它之前在编解码器中初始化它,如果它是一个不稳定的表达式,您应该在编解码器中保存该表达式以进行评估。这样,当您使用编解码器的解码功能时,您实际上将拥有运行所需的所有数据,然后您需要做的就是从BitBuffer创建适当类型的对象。