我是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()
我能够读取对象并获得正确的值,但只是想知道这是否是正确的做法?
答案 0 :(得分:2)
我不确定你为什么要创建DataOutputStream
并在第一时间调用dos.write
...
我通常会用这个:
profile.build().writeTo(output);
但是,我仍然希望该文件真的是一个二进制文件。当然,它将包括文本“123”和“John”,因为它们只是UTF-8字符串......但是那里也应该有非文本。你确定它是只是文字吗?你可以发布输出吗?