2017-04-04 70 views
0

我想创建一个长键和一个可变大小的字节[],一个序列化的Java位集精确的编年史图。我可以使用Values接口创建一个映射,但其中的数组大小是固定的。使用编年史图和字节[]或字节缓冲区

因此,我期待使用byte []或Bytebuffer,因为它们是动态调整大小的,因此可以节省内存。这是一个支持用例吗?有没有使用带有byte []或ByteBuffer值类的编年史图的例子?下面的代码失败

ChronicleMap<Long, ByteBuffer> map = ChronicleMap 
    .of(Long.class, ByteBuffer.class) 
    .name("shard_map") 
    .averageValueSize(1000) 
    .entries(1_000_000) 
    .create(); 

ByteBuffer ts2 = ByteBuffer.allocateDirect(10); 
ts2.putInt(10); 
map.put(1L, ts2); 
System.out.println(map.get(1L).getInt()); 

与错误:

Exception in thread "main" java.nio.BufferUnderflowException 
    at java.nio.Buffer.nextGetIndex(Buffer.java:506) 
    at java.nio.HeapByteBuffer.getInt(HeapByteBuffer.java:361) 

我曾尝试创建与Values.newHeapInstance值对象,但失败,出现错误:

Exception in thread "main" java.lang.IllegalArgumentException: class java.nio.ByteBuffer is not an interface nor a generated class native or heap class 
    at net.openhft.chronicle.values.ValueModel.notValueInterfaceOfImpl(ValueModel.java:68) 
    at net.openhft.chronicle.values.ValueModel.lambda$acquire$0(ValueModel.java:64) 
    at net.openhft.chronicle.values.ValueModel.doSomethingForInterfaceOr(ValueModel.java:85) 
    at net.openhft.chronicle.values.ValueModel.acquire(ValueModel.java:63) 
    at net.openhft.chronicle.values.Values.heapClassFor(Values.java:68) 
    at net.openhft.chronicle.values.Values.newHeapInstance(Values.java:37) 

文档说byte []和ByteBuffer是开箱即用的,但是我找不到一个有效的例子,所以决定在这里问一下。

回答

0

您的测试在我的机器上运行(无错误结束),但打印出意外输出“0”。那是因为你忘了打电话给ts2.flip(),代码应该是这样的:

ts2.putInt(10); 
ts2.flip(); 
map.put(1L, ts2); 

随着这一变化,该片断输出“10”。

Chronicle Map开箱即用,在ByteBuffer的位置和限制之间序列化ByteBuffer的内容。你可以在你的自定义序列化器中覆盖它,并写入整个缓冲区。

顺便说一句,在你的情况下,我不建议使用小型直接缓冲区只是将值放入Chronicle Map(ts2)中。为此使用普通的堆缓冲区。

+0

谢谢!这工作!看起来像翻转造成了所有的差异。 –