协议缓冲区—如何在java中使用protobuf获取和解析序列化字符串?

z6psavjg  于 2021-06-25  发布在  Flink
关注(0)|答案(1)|浏览(565)

有一个客户端使用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代码是在ApacheFlink的上下文中运行的,因此错误消息很长而且不清楚。但是当我省略parsefrom行时,不会发生错误,而且很明显,省略这一行后,接收到的数据就不能使用了。
protobuf的版本是3.5.0。

xwbd5t1u

xwbd5t1u1#

解决方案是在中序列化/反序列化 JSON 使用 Json.Printer 以及 Json.Parser 课程由提供 protobuf-java-util .

java实现

添加此依赖项:

<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();
    }

}

相关问题