3

在调试视图中:

这是编码成混乱字符串的代码......

((S2CEnterCollection)objS2c).toByteString().toStringUtf8();

输出:

    ���"default(
    ���"default(
    ���"default(
    ���"default(
    ���"default(
    ����"default(
    ����"default(
    �����"default(

这是具有正确字符串的代码:

((S2CEnterCollection)objS2c).toString()

原来的字符串是:

    cardList {
      cardId: 100001
      liked: 100
      number: 10
      finder: "default"
      rank: 1
    }
    cardList {
      cardId: 100002
      liked: 123
      number: 10
      finder: "default"
      rank: 1
    }
    cardList {
      cardId: 100003
      liked: 543
      number: 10
      finder: "default"
      rank: 1
    }
    cardList {
      cardId: 100004
      liked: 766
      number: 10
      finder: "default"
      rank: 1
    }
    cardList {
      cardId: 100005
      liked: 78
      number: 10
      finder: "default"
      rank: 1
    }
    cardList {
      cardId: 100006
      liked: 89
      number: 123
      finder: "default"
      rank: 1
    }
    cardList {
      cardId: 100007
      liked: 199
      number: 567
      finder: "default"
      rank: 1
    }
    cardList {
      cardId: 100008
      liked: 90909
      number: 232
      finder: "default"
      rank: 1
    }

那么,有人知道它是如何工作的吗?

4

3 回答 3

3

protobuf 数据是二进制的,不是编码文本。您不能通过 UTF-8 之类的编码运行它并期望得到一个字符串(或期望它仍然有效)。将 protobuf 数据转换为字符串的唯一方法是通过 base-N 编码对某些 N 运行它,通常为 64(因为它在大多数平台上都得到了很好的支持)。

于 2013-01-07T08:11:09.843 回答
2

那个凌乱的字符串可能是绝对正确的。问题是:您假设它是人类可读的字符串,但事实并非如此。toByteString(),我引用:

Serializes the message to a ByteString and returns it. This is just a trivial wrapper around writeTo(CodedOutputStream).

https://developers.google.com/protocol-buffers/docs/reference/java/index - 寻找 MessageLite。

它是您可以用来通过网络传输的那种格式,或者您可以存储在具有数百万条记录的文件中的某种格式。它并不是人类可读的——它是一种相对较小的机器可读表示。因此,它会使用标签标识符(小数字)而不是字段名称、可变长度编码和各种其他技巧来最小化大小,但会牺牲可读性。

https://developers.google.com/protocol-buffers/docs/encoding

于 2013-01-07T05:07:42.537 回答
1

我更喜欢使用 Google 自己的 com.google.protobuf.TextFormat 类,该类使用它的“打印”方法构建 Protobuf 对象内容的人类可读表示。在下面的示例中,PayloadContent 可以是任何消息:

PayloadContent pc = PayloadContent.newBuilder().setContent........build();
String text = TextFormat.shortDebugString(pc);

但是,如果您想查看“字节”格式,请务必将 ByteString 表示形式转换为 Base64 - 但这对人类阅读没有多大用处:)

于 2013-01-08T18:19:59.863 回答