我正在尝试使用协议缓冲区来记录一些市场数据。每次我从市场上得到报价通知,我都会把这个引用转换成协议缓冲对象。然后我称之为“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吗?
谢谢!
答案 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