Протокол буфера в файл? - PullRequest
3 голосов
/ 22 июня 2010

Я новичок в протоколе буферов и считаю это хорошим подходом. Я создал файл proto и с помощью компилятора сгенерировал Java-бины.

Используя этот Java-компонент, я инициализирую объект и пытаюсь записать его в файл. Цель состоит в том, чтобы просто увидеть, насколько большой файл. В данный момент у меня нет готовых тестов клиент / сервер для тестирования через HTTP. Сейчас я просто пытаюсь показать моей команде, как выглядит запрос / ответ с использованием буферов протокола.

Код, который у меня есть, выглядит примерно так:

=== Прото-файл ===

Profile {
  optional string name=1
  optional string id=2

  message DocGuids {
     required string docguids=3
  }

  repeated DocGuids docguids=4
}

=== Пример кода ===

ProfileRequest.Builder profile = ProfileRequest.newBuilder();
profile.setName("John");
profile.setId("123");

for (int i=0;i<10;i++) {
 ProfileRequest.DocGuids.Builder docGuids = ProfileRequest.DocGuids.newBuilder();
 docGuids.setDocguid(GUID.guid()); 
     profile.addDocguids(docGuids);   
}

//write to disk
try {
    // Write the new address book back to disk.
   FileOutputStream output = new FileOutputStream("c:\\testProto.txt");
   DataOutputStream dos = new DataOutputStream(output);                  
       dos.write(profile.build().toByteArray());     
   dos.close();
   output.close();   
} catch (Exception e) {   
}

Когда я проверял testProto.txt, я увидел, что файл записан как текстовый файл, а не как двоичный файл, хотя я использую toByteArray.

Кто-нибудь может помочь?

Спасибо

Кстати, это код для чтения этого файла:

// Read from disk
FileInputStream input = new FileInputStream("c:\\testProto.txt");
DataInputStream dis = new DataInputStream(input);
profileBuild.mergeFrom(dis);
dis.close();
input.close()

Я могу прочитать объект и получить значение просто отлично, но мне просто интересно, правильный ли это подход?

1 Ответ

2 голосов
/ 22 июня 2010

Я не уверен, почему вы создаете DataOutputStream и сначала звоните dos.write ...

Я бы обычно использовал это:

profile.build().writeTo(output);

Однако я бы все-таки ожидал, что файл действительно будет двоичным. Конечно, это будет включать в себя текст «123» и «Джон», так как это всего лишь строки UTF-8 ... но там должен был быть и не текст Вы уверены, что это просто текст? Не могли бы вы опубликовать вывод?

...