2010-06-22 233 views
3

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

使用此Java Beans,我初始化该对象,并尝试将其写入文件。 目的只是为了看看文件有多大。 我目前没有准备好客户机/服务器测试,可以通过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() 

我能够读取对象,并获得价值就好了,但只是想知道如果是这样的正确的做法呢?

回答

2

我不知道为什么要创建的DataOutputStream,并呼吁在首位dos.write ...

我通常会用这个:

profile.build().writeTo(output); 

不过,我仍然会预期该文件真的是一个二进制文件。当然,它会包含文本“123”和“John”,因为这些字符串只是UTF-8字符串......但在那里也应该有非文本。你确定它是只是文字?你可以发布输出吗?

+0

这里是输出中:! 123John# i0ad0290e000001296033cf0b540e7ae7# i0ad0290e000001296033cf0b540e7ae8# Alhtough之前和123(和John)之后,就在我的TextPad一些奇怪的字符这我不能复制到这里。 我在想这可能是“制表符”字符 – user373307 2010-06-22 15:11:47

+1

@workrelated:我建议你在十六进制编辑器中查看文件。只是因为一个文件具有可识别的文本并不意味着它是一个文本文件。结合pb格式规范来看看它。 – 2010-06-22 15:19:07

+0

谢谢乔恩。我使用读取该文件的示例代码更新了上述问题。这是一个正确的方法吗? – user373307 2010-06-22 15:23:53