writeDelimitedTo / parseDelimitedFrom似乎正在丢失数据

时间:2013-12-20 15:46:04

标签: java protocol-buffers

我正在尝试使用协议缓冲区来记录一些市场数据。每次我从市场上得到报价通知,我都会把这个引用转换成协议缓冲对象。然后我称之为“writeDelimitedTo”

我的录音机示例:

try {
    writeLock.lock();

    LimitOrder serializableQuote = ...
    LimitOrderTransport gpbQuoteRaw = serializableQuote.serialize();
    LimitOrderTransport gpbQuote = LimitOrderTransport.newBuilder(gpbQuoteRaw).build();
    gpbQuote.writeDelimitedTo(fileStream);

    csvWriter1.println(gpbQuote.getIdNumber() + DELIMITER+ gpbQuote.getSymbol() + ...);

} finally {
    writeLock.unlock();
}

锁定的原因是因为来自不同市场的报价由不同的线程处理,所以我试图简化并“序列化”日志记录到文件。

读取生成的文件的代码:

FileInputStream stream = new FileInputStream(pathToFile);
PrintWriter writer = new PrintWriter("quoteStream6-compare.csv", "UTF-8");

while(LimitOrderTransport.newBuilder().mergeDelimitedFrom(stream)) {
   LimitOrderTransport gpbQuote= LimitOrderTransport.parseDelimitedFrom(stream);

   csvWriter2.println(gpbQuote.getIdNumber()+DELIMITER+ gpbQuote.getSymbol() ...);

}

当我运行录音机时,我得到一个似乎增长的二进制文件。当我使用我的阅读器从文件中读取时,我似乎也得到了大量的引号。它们都是不同的,看起来是正确的。

问题在于:许多引号似乎“缺失” - 当我的读者从文件中读取时不存在。

我尝试了csvWriter1和csvWriter2的实验。在我的编写器中,我写了一个csv文件,然后在我的阅读器中,我使用我的protobufs文件作为源写入第二个cvs文件。

理论是他们应该匹配。他们不匹配。原始csv文件中包含的引号多于我通过读取我的protobufs记录数据生成的csv。

是什么给出的?我没有正确使用writeDelimitedTo / parseDelimitedFrom吗?

谢谢!

1 个答案:

答案 0 :(得分:4)

你的问题在这里:

while(LimitOrderTransport.newBuilder().mergeDelimitedFrom(stream)) {
  LimitOrderTransport gpbQuote= LimitOrderTransport.parseDelimitedFrom(stream);

第一行构造一个新的LimitOrderTransport.Builder并使用它来解析来自流的消息。然后丢弃该构建器。

第二行将同一个流中的 new 消息解析为 new 构建器。

所以你要丢弃所有其他信息。

请改为:

while (true) {
  LimitOrderTransport gpbQuote = LimitOrderTransport.parseDelimitedFrom(stream);
  if (gpbQuote == null) break;  // EOF