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

序列化Java对象时,是否可以捕获对象字段和方法的字节偏移量?,java,serialization,bytebuffer,Java,Serialization,Bytebuffer,我对这样做很感兴趣,因为我想将Java对象写入DirectByteBuffers,然后以一种快速的方式访问和操作对象,而无需反序列化。其思想是避免在GC管理的堆上创建对象,而是在非堆DirectByteBuffers中创建对象,然后使用一种安全的方法来操作这些对象。如果确实需要,可以这样做,请参阅此处的对象序列化流协议。如果确实需要,可以这样做,请参见此处的对象序列化流协议这是可能的,但是您需要自己完成所有工作,或者使用一个库来完成这项工作。Javolution Structs支持将堆外内存映射

我对这样做很感兴趣,因为我想将Java对象写入DirectByteBuffers,然后以一种快速的方式访问和操作对象,而无需反序列化。其思想是避免在GC管理的堆上创建对象,而是在非堆DirectByteBuffers中创建对象,然后使用一种安全的方法来操作这些对象。

如果确实需要,可以这样做,请参阅此处的对象序列化流协议。

如果确实需要,可以这样做,请参见此处的对象序列化流协议

这是可能的,但是您需要自己完成所有工作,或者使用一个库来完成这项工作。Javolution Structs支持将堆外内存映射为数据结构。

这是可能的,但是您需要自己完成所有工作,或者使用一个库来完成这项工作。Javolution Structs支持将堆外内存映射为数据结构。

可以使用不安全类捕获偏移量。但是,您将无法将有效的ObjectPointer获取到byteBuffer中,因此您可能能够(理论上)在byteBuffer中创建可访问的对象,但您将无法实际操作它们

一种方法是在运行时生成字节码,并创建一种“指针”——当调用getter/setter时访问字节缓冲区的包装类

类似的示例(但使用字节数组而不是bytebuffer) 可以在这里找到


可以使用不安全类捕获偏移量。但是,您将无法将有效的ObjectPointer获取到byteBuffer中,因此您可能能够(理论上)在byteBuffer中创建可访问的对象,但您将无法实际操作它们

一种方法是在运行时生成字节码,并创建一种“指针”——当调用getter/setter时访问字节缓冲区的包装类

类似的示例(但使用字节数组而不是bytebuffer) 可以在这里找到


您对这种解决方案有何看法,这是一种解决方案

 interface OffsetMemberMap {
     Map<String,Long> offsetMemberMap();
}
接口偏移成员映射{
Map offsetMemberMap();
}
其思想是创建实现上述接口的对象,该映射将针对每个成员的字符串存储内存地址。首先创建子对象,一旦添加到DirectByteBuffer,偏移位置将存储在此地图中的父对象中。 为了访问一个特定的成员,用户需要提供一个字符串来寻址该成员,因此只需要反序列化所需的内容。这将允许您在DirectByteBuffers中存储大型链接对象,同时只能对写入/读取时所需的位进行序列化/反序列化

因此,如果您有一个具有HeadTeacher成员且HeadTeacher具有Details成员的学校类,则可以使用类似School.HeadTeacher.Details的字符串从DirectByteBuffer访问Details实例


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

您对这种解决方案有何看法,这需要解决一些问题

 interface OffsetMemberMap {
     Map<String,Long> offsetMemberMap();
}
接口偏移成员映射{
Map offsetMemberMap();
}
其思想是创建实现上述接口的对象,该映射将针对每个成员的字符串存储内存地址。首先创建子对象,一旦添加到DirectByteBuffer,偏移位置将存储在此地图中的父对象中。 为了访问一个特定的成员,用户需要提供一个字符串来寻址该成员,因此只需要反序列化所需的内容。这将允许您在DirectByteBuffers中存储大型链接对象,同时只能对写入/读取时所需的位进行序列化/反序列化

因此,如果您有一个具有HeadTeacher成员且HeadTeacher具有Details成员的学校类,则可以使用类似School.HeadTeacher.Details的字符串从DirectByteBuffer访问Details实例


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

可以实现
readObject
writeObject
来手动处理对象序列化/反序列化。我不知道java序列化捕获的方法。重复你的@JasonSperske没有,但是问题中没有提到方法。你的观点是什么?我只是回答了问题标题中的“字段和方法”部分,但这个问题似乎得到了比我知道得多的人的很好的回答。我认为我没有任何有意义的见解可以补充。你可以实现
readObject
writeObject
来手动处理对象序列化/反序列化。我不知道java序列化捕获的方法。你的@JasonSperske的副本没有,但问题中没有提到方法。你的观点是什么?我只是回答了问题标题中的“字段和方法”部分,但这个问题似乎得到了比我知道得多的人的很好的回答。我认为我没有任何有意义的见解可以补充。