协议缓冲区要提交?

时间:2010-06-22 14:46:40

标签: protocols protocol-buffers

我是Protocol Buffers的新手,并认为这是一个很好的方法。 我创建了一个proto文件,并使用编译器生成了Java bean。

使用这个Java Bean,我初始化对象,并尝试将其写入文件。 目的只是看文件有多大。 此时我没有准备好客户端/服务器测试来通过HTTP进行测试。 我只是想在这一点上向我的团队展示请求/响应如何使用协议缓冲区。

我的代码是这样的:

=== Proto file ===

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 个答案:

答案 0 :(得分:2)

我不确定你为什么要创建DataOutputStream并在第一时间调用dos.write ...

我通常会用这个:

profile.build().writeTo(output);

但是,我仍然希望该文件真的是一个二进制文件。当然,它将包括文本“123”和“John”,因为它们只是UTF-8字符串......但是那里也应该有非文本。你确定它是只是文字吗?你可以发布输出吗?