当前位置: 首页 > 知识库问答 >
问题:

将protobuf消息转换为Java中的字符串以保持持久

东门清夷
2023-03-14

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

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

编辑

使用字节字符串进行持久化似乎不起作用:

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

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

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

谢谢!

共有1个答案

长孙和悦
2023-03-14

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

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

 类似资料:
  • 谁能让我知道如何在Java将protobuf字节字符串转换成字符串吗? 在我的例子中,我获得的字节字符串值为“\376\024\367”。有没有办法从bytestring中得到与String相同的东西?我的意思是,当我使用system.out.println()在控制台中打印字符串值时,我应该得到\376\024\367。 多谢。

  • 问题内容: 我需要将由某些特定于某些语言的字母(例如HÄSTDJUR-注意Ä)组成的s 转换为不带那些特殊字母(在这种情况下为HASTDJUR)的。如何用Java做到这一点?感谢帮助! 它不是真的如何听起来。该场景如下-您要使用该应用程序,但没有瑞典语键盘。因此,您无需查看字符映射表,而是通过将特殊字母替换为拉丁字母中的典型字母来键入它。 问题答案: 我认为您的问题与此问题相同: Java-消除重

  • 问题内容: 得到了以下格式的字符串:YYYY-MM-DD- HH.MM.SS.NNNNNN时间戳记来自DB2数据库。我需要将其解析为java.sql.Timestamp,并且不要丢失任何精度。到目前为止,我一直找不到现有的代码来解析这么多毫秒。SimpleDateFormat返回一个Date,并且仅解析为毫秒。简短地看了一下JodaTime,也没有发现任何效果。 问题答案: 您是否尝试过使用?看起

  • 问题内容: 将带逗号的字符串数字(例如:835,111.2)转换为Double实例的最简单,正确的方法是什么。 谢谢。 问题答案: 看一看。例如: 根据您使用的数量类型,您可能想解析为一个。最简单的方法可能是: 或与一起使用:

  • 问题内容: 我不确定是我还是什么,但是将双精度转换为字符串时遇到问题。 这是我的代码: 我是在做错事还是在这里错过了一步。 尝试将其转换时出现错误。 我正在尝试在onTouchListener中执行此操作。病态发布更多代码,基本上是当用户触摸编辑文本框时,我希望信息计算填充编辑文本框。 问题答案: 这会将double转换为String

  • 问题内容: 我想将String转换为KeyEvent以执行以下操作: 问题答案: 我基本上是在用荣耀的声明。简单快捷: 如果要进行一些自定义键键入,则可以扩展该类并重写该type(char)方法。例如: 当然,还有改进的余地,但是你知道了。