在现有对象上反序列化Google Protobuf有线消息

时间:2019-03-28 19:28:27

标签: java deserialization protocol-buffers google-protocol-buffer

我有一个Java应用程序,想重新使用现有对象来反序列化传入的Google protobuf有线消息(字节[])。

我正在尝试解码现有的有线消息,并检查生成的Class文件中的方法,以查看是否有任何方法可以在已经创建的ProtoBuf Class对象上反序列化byte []。

我正在反序列化传入的有线缓冲区(字节[]),但是每次在类上调用parseFrom时,它都会创建Protobuf类的新对象。我想重用类对象。我尝试在对象上调用parseFrom(byte [])方法,但由于其静态方法的行为相同。

这是示例deserializeMessage()方法:

 public boolean deserializeMessage(byte[] wireMessage) throws InvalidProtocolBufferException
 { 
    // mktDataMsg = mktDataMsg.parseFrom(wireMessage); ==> Creates new object 
    mktDataMsg = MktDataMessage.parseFrom(wireMessage); 
    // Above code also creates new object of MktDataMessage. I want to 
    // decode wireMesage on existing object and overwrite field
    // values. That will avoid extra GC objects.
    return true;
 }

是否有任何选项可以重新使用对象来解码传入的有线消息(字节[])?

这些是我在Java中对10万条消息进行序列化和反序列化并运行10次迭代并获得所有数字的平均值时的性能数字。

Msg Size|Total Data Processed (Mb)|Java Serialize Time|Java Deserialize Time
195     |19.5                     |                 19|                   45
1095    |109.5                    |                 84|                  132
2095    |209.5                    |                160|                  233
3095    |309.5                    |                230|                  294
4095    |409.5                    |                847|                 2465
5095    |509.5                    |               1037|                 3006
6095    |609.5                    |               1266|                 3766

0 个答案:

没有答案