有一个客户端使用 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.Printer
和Json.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();
}
}