如何在java中使用protobuf获取和解析序列化字符串?



有一个客户端使用 protobuf 序列化某些值。这个客户端是由python编程的。我使用套接字将序列化结果发送到 java 代码:

serializedRow = t_event.SerializeToString()
sock.send(serializedRow)

在java代码中,消息以字符串形式接收,但在"ParseFrom"函数的步骤中,存在一些模棱两可的错误。由于 ParseFrom 的参数是 Bytes,因此在传递字符串之前,它会转换为 Bytes。

byte[] bytes = row.getBytes();
TaxiEvent taxiEvent1 = TaxiEvent.ParseFrom(bytes);
int sec = taxiEvent1.getTripTimeInSecs();

java代码在Apache Flink的上下文中运行,因此错误消息很长且不清楚。 但是当我省略 parsefrom 行时,不会发生错误,显然通过省略这一行,接收到的数据无法使用。

protobuf 的版本是 3.5.0。

一种解决方案是使用protobuf-java-util提供的Json.PrinterJson.Parser类在JSON中序列化/反序列化。

爪哇实现

添加此依赖项:

<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java-util</artifactId>
<version>3.8.0</version>
</parent>

代码示例:

import com.google.protobuf.InvalidProtocolBufferException;
import com.google.protobuf.util.JsonFormat;
public class EventHelper {
private static final JsonFormat.Printer PRINTER = JsonFormat.printer();
private static final JsonFormat.Parser PARSER = JsonFormat.parser();
public static String toFunctionId(Event event) throwsInvalidProtocolBufferException {
return PRINTER.print(event);
}
public static Event toEvent(String functionId) throws InvalidProtocolBufferException {
Event.Builder builder = Event.newBuilder();
PARSER.merge(functionId, builder);
return builder.build();
}
}

相关内容

  • 没有找到相关文章

最新更新