当前位置: 首页 > 面试题库 >

Google Protobuf ByteString与Byte []

丰博
2023-03-14
问题内容

我正在使用Java中的Google protobuf。我看到可以将protobuf消息序列化为String,byte
[],ByteString等:(来源:https :
//developers.google.com/protocol-
buffers/docs/reference/java/com/google/protobuf /
MessageLite)

我不知道什么是ByteString。我从protobuf
API文档中获得了以下定义(来源:https :
//developers.google.com/protocol-
buffers/docs/reference/java/com/google/protobuf/ByteString):“字节的固定序列。子字符串与String一样,通过共享对不可变基础字节的引用来支持。”

我不清楚ByteString与String或byte []有何不同。有人可以解释一下吗?谢谢。


问题答案:

您可以将其ByteString视为不可变的字节数组。就是这样。byte[]您可以在protobuf中使用它。Protobuf不允许您使用Java数组,因为它们是可变的。

ByteString之所以存在,String是因为它不适合表示任意字节序列。String专用于字符数据。

protobuf MessageLite接口提供toByteArray()和toByteString()方法。如果ByteString是不可变的byte
[],则由ByteString和byte []表示的消息的字节表示形式是否相同?

有点。如果您致电,toByteArray()您将获得与致电相同的值toByteString().toByteArray()。比较以下两种方法的实现AbstractMessageLite

public ByteString toByteString() {
  try {
    final ByteString.CodedBuilder out =
      ByteString.newCodedBuilder(getSerializedSize());
    writeTo(out.getCodedOutput());
    return out.build();
  } catch (IOException e) {
    throw new RuntimeException(
      "Serializing to a ByteString threw an IOException (should " +
      "never happen).", e);
  }
}

public byte[] toByteArray() {
  try {
    final byte[] result = new byte[getSerializedSize()];
    final CodedOutputStream output = CodedOutputStream.newInstance(result);
    writeTo(output);
    output.checkNoSpaceLeft();
    return result;
  } catch (IOException e) {
    throw new RuntimeException(
      "Serializing to a byte array threw an IOException " +
      "(should never happen).", e);
  }
}


 类似资料:
  • 问题内容: 到或到,这就是问题。 多年来,我一直坚持认为,由于是操作系统级别的直接内存映射,因此与get相比,它在执行get / put调用时将执行得更快。到目前为止,我从来没有真正对找到有关该情况的确切细节感兴趣。我想知道这两种类型中的哪种更快,以及在什么条件下。 问题答案: 操作系统在内存区域上执行I / O操作。就操作系统而言,这些存储区是连续的字节序列。因此,只有字节缓冲区才有资格参与I

  • 在C语言中,假设每个算法被赋予完全相同的一组进程,那么先到先得、最短作业优先和循环之间的周转时间是否相等?还是调度算法不同?

  • 问题内容: 为了为 HTML5 Doctype 定义字符集,我应该使用哪种表示法? 短: 长: 问题答案: 在HTML5中,它们是等效的。使用较短的一个,更容易记住和键入。浏览器支持很好,因为它是为向后兼容而设计的。

  • 连接的多个输入都相当于Yes的时候才会输出Yes。 用法 Your browser does not support the video tag. 案例:小闹钟 功能:今天15:10:00,响起猫叫声小闹钟 工作原理 当所有的输入都是Yes的时候,与节点才输出Yes。

  • 问题内容: 似乎有三种 相同的 方法可以独立于平台获取依赖于平台的“文件分隔符”: 我们如何决定何时使用哪个? 它们之间甚至有什么区别吗? 问题答案: 可以通过调用命令行参数或使用命令行参数覆盖 获取默认文件系统的分隔符。 获取默认文件系统。 获取文件系统的分隔符。请注意,作为一种实例方法,在需要代码在一个JVM中对多个文件系统进行操作的情况下,可以使用该方法将不同的文件系统传递给代码(而不是默认