writeDelimitedTo/parseDelimitedFrom 似乎正在丢失数据

eak*_*913 4 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();
}
Run Code Online (Sandbox Code Playgroud)

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

读取结果文件的代码:

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() ...);

}
Run Code Online (Sandbox Code Playgroud)

当我运行记录器时,我得到一个似乎在增大的二进制文件。当我使用阅读器阅读文件时,我似乎也得到了大量的引用。它们都是不同的并且看起来都是正确的。

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

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

理论上来说,它们应该匹配。他们不匹配。原始 csv 文件包含的引号比我通过读取 protobufs 记录数据生成的 csv 更多。

是什么赋予了?我是否没有正确使用 writeDelimitedTo/parseDelimitedFrom ?

谢谢!

Ken*_*rda 5

你的问题在这里:

while(LimitOrderTransport.newBuilder().mergeDelimitedFrom(stream)) {
  LimitOrderTransport gpbQuote= LimitOrderTransport.parseDelimitedFrom(stream);
Run Code Online (Sandbox Code Playgroud)

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

第二行将来自同一流的新消息解析到新的构建器中。

所以你正在丢弃所有其他消息。

改为这样做:

while (true) {
  LimitOrderTransport gpbQuote = LimitOrderTransport.parseDelimitedFrom(stream);
  if (gpbQuote == null) break;  // EOF
Run Code Online (Sandbox Code Playgroud)