java - 如何将 proto3 消息序列化为字符串并返回?

标签 java protocol-buffers

在 Java 中,我想将一个 proto3 消息转换成一个字符串:

  1. 我可以通过 HTTP 发送
  2. 随着更多字段被添加到原型(prototype)中,它仍然能够反序列化旧字符串吗?

如果你想知道为什么我需要序列化成一个字符串,我有一个原型(prototype):

message Order {
  ...
}

我想从中创建一个我想传递的字符串“order_tag”。

我看到了com.google.protobuf.TextFormat但它说它适用于 proto2,也没有说明向后兼容性。

最佳答案

您可以将消息序列化为字节,并使用base64编码将序列化后的值转换为字符串。这样,即使字段发生变化,只要架构更改发生在 https://developers.google.com/protocol-buffers/docs/proto3#updating 中定义的限制范围内,您就应该能够反序列化字符串。 .

除非出于调试目的,否则不要使用文本编码。它不提供与二进制格式相同的向后兼容性保证(例如,更改字段名称将破坏现有的序列化数据)。

序列化为字符串:

BaseEncoding.base64().encode(order.toByteArray())

反序列化:

Order.parseFrom(BaseEncoding.base64().decode(orderStr))

关于java - 如何将 proto3 消息序列化为字符串并返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61242789/

相关文章:

java - Java Apache HttClient : ThreadSafe or not?

Java RMI 与 JFrame - 从客户端获取文本到 GUI

scala - 使用 scalapb 在 Spark Streaming 中解码 Proto Buf 消息时出错

c++ - 使 shared_ptr 失去内存所有权

android - Protobuf 2.5.0 错误?

java - 为什么我们不应该对 double 变量使用 int 值? (OCA考试)

java - 在使用 BouncyCaSTLe 时何时以及为何使用 ArmoredOutputStream 装饰 OutputStream

java - 无法解析符号 "newBuilder"protobuf

C# Google.ProtocolBuffers 反序列化方法 (proto3)

java - 如何修复 KeyListener