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

标签 java protocol-buffers apache-flink

有一个客户端使用 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 提供的 Json.PrinterJson.Parser 类在 JSON 中序列化/反序列化-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();
    }

}

关于java - 如何在 java 中使用 protobuf 获取和解析序列化字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48466046/

相关文章:

scala - Apache 弗林克 : Cannot write out complex data type for Parquet

java - Arquillian ShrinkWrap 排除 import.sql

java - 什么是ActionMapping、RenderMapping?

php - 在 'Google\Protobuf\Internal\Message' 中找不到类 "Message.proto"

apache-flink - Flink Standalone Cluster (v1.4.2) 中运行多个 Flink 程序

sql - Flink SQL : source table is too big to fit into memory

java - JSP MySQL Class.forName 错误

java - 在拦截器中抛出 ConstraintViolationException

protocol-buffers - Avro 模式演变是否需要访问新旧模式?

java - 在使用 java 的客户端服务器的 Protocol Buffer 中需要帮助