0

这是我的一段代码

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();
4

2 回答 2

0

使用Values.newHeapInstance()建议MyValue就是所谓的价值接口。特定值接口的对象具有序列化形式的恒定大小。ChronicleMap 特别支持值接口,因此您根本不应该配置值大小,如教程中的示例所示

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()call 、 nor averageValueSize()、 nor constantValueSizeBySample()

显示的错误消息确实令人困惑,特别是因为 ChronicleMap 已经知道值类是一个值接口并且知道它的大小。随意在https://github.com/OpenHFT/Chronicle-Map中打开一个问题。

于 2019-01-10T13:24:24.467 回答
0

可以在源代码中找到此异常的原因:

            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 参数表示的类或接口相同,或者是其超类或超接口。如果是,则返回 true;否则返回false。如果此 Class 对象表示原始类型,则如果指定的 Class 参数正是此 Class 对象,则此方法返回 true;否则返回false。

因此,这将检查SerializableClass 是否由valueClass. 所以我的理解是你MyValue没有实现Serializable接口。

是的,甚至评论也指出:

配置平均字节数,采用序列化形式的值

所以如果我没记错的话,只要让你的值类实现Serializable接口就可以了。漂亮......我会说令人困惑的异常消息。

于 2019-01-07T06:05:47.273 回答