Java 带Preon二进制解析器的循环依赖
我有一对二进制文件要解析,它们相互依赖。我在用图书馆 这些文件名为rec.table和rec.offset。一个是指向另一个的偏移量索引(rec.offset文件的32位整数行,表示进入rec.table的字节偏移量)。rec.offset中的行数取决于rec.table(recordCount字段)中可用的一段数据。我需要提供偏移条目列表的大小,我需要该列表用于访问记录条目,如下面的@BoundList情况所示 我有以下设置:Java 带Preon二进制解析器的循环依赖,java,parsing,preon,Java,Parsing,Preon,我有一对二进制文件要解析,它们相互依赖。我在用图书馆 这些文件名为rec.table和rec.offset。一个是指向另一个的偏移量索引(rec.offset文件的32位整数行,表示进入rec.table的字节偏移量)。rec.offset中的行数取决于rec.table(recordCount字段)中可用的一段数据。我需要提供偏移条目列表的大小,我需要该列表用于访问记录条目,如下面的@BoundList情况所示 我有以下设置: package bytecodeparsing; import
package bytecodeparsing;
import org.codehaus.preon.annotation.BoundList;
import org.codehaus.preon.annotation.BoundNumber;
public class RecTable {
// Using this instead of 'outer' due to circular dependencies
@SuppressWarnings("unused") // Actually used in Preon expression below
private RecOffsets recOffsets;
@BoundNumber int version;
@BoundList(size="4") byte[] pad; // 4 byte pad to ignore.
@BoundNumber long recordCount;
// offset is in RecOffsets, which must then be an outer class of this, but that class needs to know how many entries there
// are, which is the recordCount value here. Circular dependencies?
@BoundList(offset="recOffsets.offsets[index]", size="recordCount") Rec[] recs;
public void setDependencies(RecOffsets recOffsets) {
this.recOffsets = recOffsets;
}
}
以及:
当我运行此命令时,我得到了一个类似于post“”中报告的错误:
org.codehaus.preon.codeConstructionException:无法构造编解码器。
位于org.codehaus.preon.codec.ArrayCodecFactory.getSizeExpression(ArrayCodecFactory.java:152)
位于org.codehaus.preon.codec.ArrayCodecFactory.create(ArrayCodecFactory.java:93)
位于org.codehaus.preon.codec.CompoundCodecFactory.create(CompoundCodecFactory.java:59)
在org.codehaus.preon.DefaultCodeFactory$decoratingCodeFactory.create(DefaultCodeFactory.java:266)上
位于org.codehaus.preon.codec.ObjectCodeFactory.harvestBindings(ObjectCodeFactory.java:184)
位于org.codehaus.preon.codec.ObjectCodeFactory.createCodec(ObjectCodeFactory.java:129)
位于org.codehaus.preon.codec.ObjectCodeFactory.create(ObjectCodeFactory.java:112)
位于org.codehaus.preon.codec.CachingCodecFactory.create(CachingCodecFactory.java:130)
位于org.codehaus.preon.codec.CompoundCodecFactory.create(CompoundCodecFactory.java:59)
在org.codehaus.preon.DefaultCodeFactory$decoratingCodeFactory.create(DefaultCodeFactory.java:266)上
位于org.codehaus.preon.DefaultCodeFactory.create(DefaultCodeFactory.java:137)
位于org.codehaus.preon.DefaultCodeFactory.create(DefaultCodeFactory.java:65)
位于org.codehaus.preon.DefaultCodeFactory.create(DefaultCodeFactory.java:60)
位于org.codehaus.preon.Codecs.create(Codecs.java:279)
在bytecodeparsing.PreonParsing.create处(PreonParsing.java:76)
在字节码解析时。PreonParsing。(PreonParsing.java:51)
原因:org.codehaus.preon.el.BindingException:未能为名为recTable的绑定数据创建绑定
位于org.codehaus.preon.codec.BindingsContext.selectAttribute(BindingsContext.java:101)
位于org.codehaus.preon.el.ImplicitsContext.selectAttribute(ImplicitsContext.java:52)
位于org.codehaus.preon.el.LimboWalker.vexpr(LimboWalker.java:667)
位于org.codehaus.preon.el.LimboWalker.vexpr(LimboWalker.java:488)
位于org.codehaus.preon.el.Expressions.算术(Expressions.java:125)
位于org.codehaus.preon.el.Expressions.createInteger(Expressions.java:102)
位于org.codehaus.preon.codec.ArrayCodecFactory.getSizeExpression(ArrayCodecFactory.java:148)
... 还有19个
此错误是指在偏移数组的size属性中使用recTable。就像在另一个问题中一样,我可以通过提供一个常量大小,或者伪造一个简单的@BoundNumber绑定并引用它来克服这个错误
在我上面链接的另一个问题中,用户遇到了这样一种情况:循环依赖关系跨两个类,但在解析一个文件时,我必须解析两个单独的文件。我假设wilfredspringer提到的补丁(PREON-9)已经集成到github存储库中(PREON-48)
如何处理这种循环依赖关系?我错过了一个窍门吗?我找到了这个问题的部分解决方案。我有一个非常强烈的印象,@BoundList的size属性是必需的,但当我查看Preon源代码时,我发现它不是必需的。由于所讨论的二进制偏移量文件只有偏移量,之后没有其他数据,所以我可以不指定大小。Preon很好地处理未知的列表大小:) 我希望在我正在解析的其他六个文件中不会发现另一个类似这样的循环依赖关系
package bytecodeparsing;
import org.codehaus.preon.annotation.BoundList;
import org.codehaus.preon.annotation.BoundNumber;
public class RecOffsets {
@SuppressWarnings("unused") // Actually used in Preon expression below
private RecTable recTable; // maybe use this instead of 'outer' due to circular dependencies?
@BoundList(size="RecTable.recordCount+1") long[] offsets;
public void setDependencies(RecTable recTable) {
this.recTable = recTable;
}
}
org.codehaus.preon.CodecConstructionException: Failed to construct codec.
at org.codehaus.preon.codec.ArrayCodecFactory.getSizeExpression(ArrayCodecFactory.java:152)
at org.codehaus.preon.codec.ArrayCodecFactory.create(ArrayCodecFactory.java:93)
at org.codehaus.preon.codec.CompoundCodecFactory.create(CompoundCodecFactory.java:59)
at org.codehaus.preon.DefaultCodecFactory$DecoratingCodecFactory.create(DefaultCodecFactory.java:266)
at org.codehaus.preon.codec.ObjectCodecFactory.harvestBindings(ObjectCodecFactory.java:184)
at org.codehaus.preon.codec.ObjectCodecFactory.createCodec(ObjectCodecFactory.java:129)
at org.codehaus.preon.codec.ObjectCodecFactory.create(ObjectCodecFactory.java:112)
at org.codehaus.preon.codec.CachingCodecFactory.create(CachingCodecFactory.java:130)
at org.codehaus.preon.codec.CompoundCodecFactory.create(CompoundCodecFactory.java:59)
at org.codehaus.preon.DefaultCodecFactory$DecoratingCodecFactory.create(DefaultCodecFactory.java:266)
at org.codehaus.preon.DefaultCodecFactory.create(DefaultCodecFactory.java:137)
at org.codehaus.preon.DefaultCodecFactory.create(DefaultCodecFactory.java:65)
at org.codehaus.preon.DefaultCodecFactory.create(DefaultCodecFactory.java:60)
at org.codehaus.preon.Codecs.create(Codecs.java:279)
at bytecodeparsing.PreonParsing.create(PreonParsing.java:76)
at bytecodeparsing.PreonParsing.<init>(PreonParsing.java:51)
Caused by: org.codehaus.preon.el.BindingException: Failed to create binding for bound data called recTable
at org.codehaus.preon.codec.BindingsContext.selectAttribute(BindingsContext.java:101)
at org.codehaus.preon.el.ImplicitsContext.selectAttribute(ImplicitsContext.java:52)
at org.codehaus.preon.el.LimboWalker.vexpr(LimboWalker.java:667)
at org.codehaus.preon.el.LimboWalker.vexpr(LimboWalker.java:488)
at org.codehaus.preon.el.Expressions.arithmetic(Expressions.java:125)
at org.codehaus.preon.el.Expressions.createInteger(Expressions.java:102)
at org.codehaus.preon.codec.ArrayCodecFactory.getSizeExpression(ArrayCodecFactory.java:148)
... 19 more