0

protobuf-csharp-port ライブラリ ( https://code.google.com/p/protobuf-csharp-port/ )を使用して、Google Protocol Buffers の使用に取り組んでいます。Google.ProtocolBuffers.Serialization クラスにはJsonFormatReader/JsonFormatWriterクラスがあります。それらを使用すると、JSON ドキュメントに開始中括弧と終了中括弧を配置しません。また、開始中括弧と終了中括弧を追加すると、記述した同じドキュメントを読み取ることもできません。

たとえば、Calling

        PB.ProtoBufMessage message = CreateMyMessage();

        string json;
        using (StringWriter sw = new StringWriter())
        {
            ICodedOutputStream output = JsonFormatWriter.CreateInstance(sw);

            message.WriteTo(output);
            output.Flush();
            json = sw.ToString();
        }

作成するもの:

"\"field1\":\"prop1\",\"field2\":1,\"subitem\":{\"x\":0,\"y\":0,\"z\":0}"

解析しようとすると

String jsonmessage = "{\"field1\":\"prop1\",\"field2\":1,\"subitem\":{\"x\":0,\"y\":0,\"z\":0}}"

使用して

    PB.ProtoBufMessage copy;
    ICodedInputStream input = JsonFormatReader.CreateInstance(jsonmessage);
    copy = PB.ProtoBufMessage.CreateBuilder().MergeFrom(input).Build();

私は以下を取得します:

(1:1) error: Unexpected token '{', expected: '"'.

   at Google.ProtocolBuffers.Serialization.JsonCursor.Assert(Boolean cond, Char expected)
   at Google.ProtocolBuffers.Serialization.JsonCursor.Consume(Char ch)
   at Google.ProtocolBuffers.Serialization.JsonCursor.ReadString()
   at Google.ProtocolBuffers.Serialization.JsonFormatReader.PeekNext(String& field)
   at Google.ProtocolBuffers.Serialization.AbstractReader.Google.ProtocolBuffers.ICodedInputStream.ReadTag(UInt32& fieldTag, String& fieldName)
   at ...

{ } がないのはなぜですか? これは有効な JSON ですか?

4

1 に答える 1

1

メッセージの開始/終了を書き込む/読み取る必要があります。お気に入り:

output.WriteMessageStart();
message.WriteTo(output);
output.WriteMessageEnd();

同様に読むと:

input.ReadMessageStart();
builder.MergeFrom(input);
input.ReadMessageEnd();

上記のコードは、json およびバイナリ リーダー/ライターで動作します。

于 2015-07-15T09:26:47.510 に答える