这些天来,我正在寻找一种将复杂的数据结构从Java传递到本地(C++) dll的方法,反之亦然。在阅读了许多关于JNI及其开销的文章之后,我开始寻找一种有效的方法来序列化Java/本机端的数据,并将其作为一块数据传递给另一方。这样,可以保存许多JNI调用。目前,我使用Google缓冲区来序列化许多复杂的类,并通过单个JNI调用将这些数据传递给本机层。看起来不错。例如,Java端4000个小类的序列化、JNI调用和本机端的反序列化在i7上占用了1.6ms。
java端的序列化是通过调用GPB_GENERATED_CLASS.build.toByteArray()来完成的,这实际上是在每次调用时创建一个新的字节数组。之后,使用ByteBuffer ()()函数将数组数据复制到直接中。
Google缓冲区序列化程序提供了另一个功能,可以将序列化的数据写入OutputStream。
我的问题是:
谢谢
发布于 2014-02-27 13:06:57
Google缓冲器(GPB)消息实现还提供了一个writeTo方法。
ByteArrayOutputStream非常接近您所要寻找的内容,但是,每当您访问内部字节数组时,它都会创建一个新副本,这听起来并不像您正在寻找的副本。但是,如果创建自己的OutputStream实现(类似于ByteArrayOutputStream ),则可以控制内部字节数组( DirectByteBuffer )的生命周期。这将使您能够提高性能和减少短期对象。
writeTo
void writeTo(OutputStream output)序列化消息并将其写入输出。这只是writeTo(CodedOutputStream)的一个简单的包装器。这不会刷新或关闭流。 注意:协议缓冲区不是自定界的.因此,如果在消息之后将更多的数据写入流,则必须以某种方式确保接收端的解析器不会将其解释为协议消息的一部分。可以这样做,例如,在数据之前写入消息的大小,然后确保在接收端将输入限制在该大小(例如,将InputStream封装在一个限制输入的范围内)。或者,只使用writeDelimitedTo(OutputStream)。抛出: IOException抛出IOException
https://stackoverflow.com/questions/22062124
复制相似问题