I have BTreeMap<String, Data[]> map = ..... If I call map.get("key"), It throws ClassCastException
Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [LMmTest$Data;
at com.c1x.rtb.test.MmTest.display(MmTest.java:59)
at com.c1x.rtb.test.MmTest.main(MmTest.java:39)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
Source:
import org.jetbrains.annotations.NotNull;
import org.mapdb.*;
import org.mapdb.serializer.SerializerArray;
import java.io.File;
import java.io.IOException;
import java.io.Serializable;
import java.nio.ByteBuffer;
import java.util.UUID;
public class MmTest {
static DB db = DBMaker.fileDB(new File("/tmp/fc/map3/db")).fileMmapEnableIfSupported().fileMmapPreclearDisable().closeOnJvmShutdown().make();
static BTreeMap<String, Data[]> map = db.treeMap("fc")
.keySerializer(Serializer.STRING)
.valueSerializer(new SerializerArray<Data>(new Serializer<Data>() {
@Override
public void serialize(@NotNull DataOutput2 out, @NotNull Data value) throws IOException {
out.write(ByteBuffer.allocate(4).putShort(value.value1).putShort(value.value2).array());
}
@Override
public Data deserialize(@NotNull DataInput2 input, int available) throws IOException {
return new Data(input.readShort(), input.readShort());
}
@Override
public int compare(Data first, Data second) {
return first.compareTo(second);
}
})).valuesOutsideNodesEnable().createOrOpen();
public static void main(String[] args) {
write();
display();
}
private static void write() {
String key = null;
for (long i = 0; i < 10; i++) {
key = UUID.randomUUID().toString().replace("-", "");
Data[] value = new Data[2];
value[0] = new Data((short) i, (short) i);
value[1] = new Data((short) i, (short) i);
map.put(key, value);
}
db.commit();
System.out.println(key);
}
private static void display() {
long count = 0;
for (Object object : map.keySet()) {
long start = System.currentTimeMillis();
Data[] data = map.<Data[]>get(object);
long end = System.currentTimeMillis();
System.out.println(++count + " " + object + " " + data[0] + " " + data[1] + " " + " took " + (end - start) + "ms.");
}
}
static class Data implements Comparable<Data>, Serializable {
Short value1;
Short value2;
public Data(Short value1, Short value2) {
this.value1 = value1;
this.value2 = value2;
}
@Override
public int compareTo(Data that) {
return this.value1.compareTo(that.value1);
}
@Override
public String toString() {
return "Data{" +
"value1=" + value1 +
", value2=" + value2 +
'}';
}
}
}