java - 将 protobuf 消息转换为 Java 中的字符串以实现持久性

标签 java string encoding protocol-buffers base32

我正在开发一个项目,该项目将所有数据存储在键/值对中。键和值都是字符串。改变这个超出了当前的范围。每个数据概念都由一条 protobuf 消息表示。

因此,我必须将 protobuf 消息存储为字符串。将消息存储为 message.toByteString().toString() 是否足够?或者我应该对 byte[] 进行编码,例如使用 Base32 编码?

编辑

使用 ByteString 进行持久化似乎不起作用:

Message m = ...;
ByteString s = m.toByteString();
ByteString s_ = ByteString.copyFromUtf8(s.toStringUtf8());
Message.PARSER.parseFrom(s_);

在解析协议(protocol)消息时,输入意外地在字段中间结束。这可能意味着输入已被截断,或者嵌入的消息误报了自己的长度。

那么您是否建议在 m.toByteArray() 上使用 Base32 编码?请注意,当前将数据类型从 string 更改为 byte[] 超出了范围。

谢谢!

最佳答案

如果必须将编码消息存储为文本,则应使用 base64 编码。 Base32 也可以使用,但 Base64 更紧凑且标准化更好。

使用toStringUtf8()不起作用,因为编码的消息不是UTF-8。因此,这种方法会损坏您的数据。

关于java - 将 protobuf 消息转换为 Java 中的字符串以实现持久性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25168496/

相关文章:

java - 第一次发送后几次无法接收 SNMPv3 陷阱。 [snmp4j-Java]

android - 在 android 中将数据传递给 json 时单引号不起作用

sql-server - SQL Server 数据类型来存储字符串并占用更少的空间

python - Flask Unicode 解码错误

Oracle SQL Developer 环境编码

java - 导出签名的apk后出现登录失败错误

Java 正则表达式模式匹配任何字符序列后第一次出现的 “boundary”

java - 无法将 Spring 方面设置为最低顺序

c++ - 在静态常量成员数组中将 char 类型转换为字符串

ruby-on-rails-3 - 在数据库中存储文件时,从 ASCII-8BIT 到 UTF-8 的 MongoMapper 错误 "\xFF"