【问题标题】:Protocol Buffers to file?要归档的协议缓冲区?
【发布时间】:2011-03-06 21:00:05
【问题描述】:

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

使用这个 Java Bean,我初始化了对象,并尝试将其写入文件。 目的只是查看文件有多大。 我目前还没有准备好通过 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()

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

【问题讨论】:

    标签: protocols protocol-buffers


    【解决方案1】:

    我不确定你为什么要创建 DataOutputStream 并首先调用 dos.write...

    我通常会使用这个:

    profile.build().writeTo(output);
    

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

    【讨论】:

    • 这是输出:123John#!i0ad0290e000001296033cf0b540e7ae7#!i0ad0290e000001296033cf0b540e7ae8#Alhtough 在 123 之前和之后(和 John),我的 TextPad 中有一些奇怪的字符,我无法使用我想它可能是“标签”字符
    • @workrelated:我建议你在十六进制编辑器中查看文件。仅仅因为文件中有可识别的文本并不意味着它是文本文件。结合 pb 格式规范看一下。
    • 谢谢乔恩。我用读取该文件的示例代码更新了上面的问题。这是正确的做法吗?
    • @workrelated:再说一次,你为什么使用DataInputStream?直接从FileInputStream 合并。示例代码参见地址簿示例。
    猜你喜欢
    • 1970-01-01
    • 2011-09-18
    • 2021-12-19
    • 2011-11-15
    • 1970-01-01
    • 1970-01-01
    • 2016-12-19
    • 2011-10-27
    • 1970-01-01
    相关资源
    最近更新 更多