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