序列化Java对象时,是否可以捕获对象字段和方法的字节偏移量?

时间:2013-10-18 14:43:13

标签: java serialization bytebuffer

我有兴趣这样做,因为我想将Java对象写入DirectByteBuffers,然后以快速的方式访问和操作对象,而不必反序列化。我们的想法是避免在GC托管堆上创建对象,而是在非堆DirectByteBuffers中创建对象,然后安全地操作这些对象。

4 个答案:

答案 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访问详细信息实例

即。只要您拥有父对象地址,就可以从字节缓冲区中获取父对象,从而继续获取指定的子对象。