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 データを文字列に変換する唯一の方法は、N (通常は 64) に対して base-N エンコードを実行することです (ほとんどのプラットフォームで十分にサポートされているため)。

于 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

私は、「print」メソッドを使用してProtobufオブジェクトのコンテンツの人間が読める表現を構築するGoogle独自のcom.google.protobuf.TextFormatクラスを使用することを好みます。以下の例では、PayloadContentは任意のメッセージにすることができます。

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

ただし、「バイト」形式を表示したい場合は、必ずByteString表現をBase64に変換してください。ただし、これは人間が読むのにはあまり役に立ちません:)

于 2013-01-08T18:19:59.863 に答える