2015-03-31 6 views
0

Я работаю над использованием буферов протокола Google, используя библиотеку protobuf-csharp-port (https://code.google.com/p/protobuf-csharp-port/). Класс Google.ProtocolBuffers.Serialization имеет класс JsonFormatReader/JsonFormatWriter, когда я использую их, они не помещают начало и конец фигурных скобок в документ JSON, и они не могут читать тот же самый документ, который они пишут, если я добавляю начало и конец фигурных скобок.. Протокольные буферы .Net для класса JSON, JsonFormatReader не обрабатывают крайние фигурные скобки.

Так, например 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?

ответ

0

Вам необходимо написать/прочитать начало/конец сообщения. Как:

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

Similary чтение wilhe:

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

Приведенный выше код работает с JSON и бинарных чтения/писателей.

 Смежные вопросы

  • Нет связанных вопросов^_^