我有兴趣这样做,因为我想将Java对象写入DirectByteBuffers,然后以快速的方式访问和操作对象,而不必反序列化。我们的想法是避免在GC托管堆上创建对象,而是在非堆DirectByteBuffers中创建对象,然后安全地操作这些对象。
答案 0 :(得分:1)
可以使用Unsafe类捕获偏移量。但是,您将无法在byteBuffer中获得有效的ObjectPointer,因此您可以在bytebuffer中创建(理论上)可访问的对象,但您将无法实际操作它们。
一种方法是在运行时生成字节代码并创建一种“指针” - 包装类,在调用getter / setter时访问字节缓冲区。
这样的例子(但是使用字节数组而不是bytebuffer) 可以在这里找到
http://code.google.com/p/fast-serialization/wiki/StructsIntroduction
答案 1 :(得分:0)
如果您真的需要,可以执行此操作,请参阅此处的对象序列化流协议http://docs.oracle.com/javase/7/docs/platform/serialization/spec/protocol.html
答案 2 :(得分:0)
然而,您可能需要自己完成所有工作或使用为您执行此操作的库。 Javolution Structs支持将堆内存映射为数据结构。
答案 3 :(得分:0)
您如何看待这种解决方案,这是一种解决方法......
interface OffsetMemberMap {
Map<String,Long> offsetMemberMap();
}
这个想法是创建实现上述接口的对象,这个映射将为每个成员存储针对字符串的内存地址。将首先创建子对象,并且一旦添加到DirectByteBuffer,偏移位置将存储在此映射中的父对象中。 为了访问特定成员,用户需要提供寻址该成员的字符串,因此只需要反序列化所需的内容。这将允许您在DirectByteBuffers中存储大型链接对象,同时只能序列化/反序列化写入/读取时所需的位。
因此,如果你有一个School类,有HeadTeacher成员且HeadTeacher有一个Details成员,你可以使用像school.headteacher.details这样的字符串从DirectByteBuffer访问详细信息实例
即。只要您拥有父对象地址,就可以从字节缓冲区中获取父对象,从而继续获取指定的子对象。