这是我拥有的代码
MyValue sampleValue = Values.newHeapInstance(MyValue.class);
// subsequently set the couple of floats and int i have defined in MyValue interface
ChronicleMap<MyKey, MyValue> cache = ChronicleMapBuilder.of(MyKey.class, MyValue.class)
.entries(100)
.averageValue(sampleValue)
.create();
执行此操作时出现错误
java.lang.IllegalArgumentException:使用BytesMarshallable和 在以下位置不支持接口值类型 net.openhft.chronicle.map.ChronicleMapBuilder.averageValue(ChronicleMapBuilder.java:660)
有人可以帮助我了解此使用方式是否正确吗?
如果我改为通过实现一个具体的类来创建MyValue,然后对其进行如下操作,那么它将起作用:
MyValue sampleValue = new MyValueImpl();
// subsequently set the couple of floats and int i have defined in MyValue interface
ChronicleMap<MyKey, MyValue> cache = ChronicleMapBuilder.of(MyKey.class, MyValue.class)
.entries(100)
.averageValue(sampleValue)
.create();
答案 0 :(得分:0)
此异常的原因可以在source中找到:
if (Serializable.class.isAssignableFrom(valueClass))
LOG.warn("BytesMarshallable " + valueClass + " will be serialized as Serializable as the value class is an interface");
else
throw new IllegalArgumentException("Using BytesMarshallable and an interface value type not supported");
}
只需调用Class类的isAssignableFrom方法即可检查:
确定此Class对象表示的类还是接口 与该对象相同,或者是该对象的超类或超接口 指定的Class参数表示的class或接口。它 如果是,则返回true;否则返回false。如果此Class对象 表示原始类型,如果指定 Class参数正是此Class对象;否则返回 错误。
因此,这检查Serializable
类是否由valueClass
表示。因此,我的理解是您的MyValue
未实现Serializable
接口。
是的,甚至评论也指出了这一点:
配置平均字节数,采用序列化形式 值
因此,如果我没记错的话,只需让您的Value Class实现Serializable
接口,就可以了。我会说的……相当令人困惑的异常消息。
答案 1 :(得分:0)
使用Values.newHeapInstance()
表示MyValue
是所谓的value interface。特定值接口的对象具有序列化形式的恒定大小。值接口特别受ChronicleMap支持,因此您根本不应该配置值大小,如this example from tutorial中所述:
ChronicleMap<LongValue, Order> orders = ChronicleMap
.of(LongValue.class, Order.class)
.name("orders-map")
.entries(1_000_000)
.create();
LongValue key = Values.newHeapInstance(LongValue.class);
key.setValue(id);
orders.put(key, order);
请注意,没有averageValue()
调用,也没有averageValueSize()
,也没有constantValueSizeBySample()
。
给出的错误消息确实令人困惑,特别是因为ChronicleMap已经知道值类是一个值接口并且知道其大小。随时在https://github.com/OpenHFT/Chronicle-Map中打开问题。