簡體   English   中英

C ++ protobuf:如何通過“SerializeToOstream()”將多個消息寫入文件

[英]C++ protobuf: how to write multiple messages into file by “SerializeToOstream()”

我發現當我使用SerializeToOstream()時,只有最后一條消息被寫入文件,之前的消息都被以后的調用覆蓋。 像這樣:

我是你的hello.proto:

message hello
{
    required int32 f1=1;
    required int32 f2=2;
    optional int32 f3=3;
}

然后我編譯並在一個cpp文件中使用它:

#include "hello.pb.h"
#include<fstream>
#include<iostream>
using namespace std;
int main()
{
    fstream fo("./hello.data",ios::binary|ios::out);
    hello p1,p2,p3;
    p1.set_f1(1);
    p1.set_f2(2);
    p2.set_f1(3);
    p2.set_f2(4);
    p3.set_f1(5);
    p3.set_f2(6);
    p1.SerializeToOstream(&fo);
    p2.SerializeToOstream(&fo);
    p3.SerializeToOstream(&fo);
    fo.close();

    fstream fi("./hello.data",ios::binary|ios::in);
    hello pi;
    pi.ParseFromIstream(&fi);
    cout<<pi.f1()<<pi.f2()<<endl;
    return 0;
}

好吧,我發現只有“p3”被寫入這個“hello.data”,p1和p2被覆蓋了某種方式?

為什么protobuf只寫最后一條消息? 我們通常使用protobuf來傳遞多條消息,對吧? 那么如何將多條消息寫入一個文件? 如何糾正我的程序?

這里的問題是協議緩沖區不是自定界限的; 要解析一條消息,您必須事先知道要讀取多少字節。 由於有線格式的工作方式,您可以連接兩個(或更多)序列化協議緩沖區,但仍然有一個有效的消息; 對於任何給定的奇異域,后面的值優先於先前的值。 所以發生的事情是ParseFromIstream正在讀取所有三個序列化消息,就像它們是一條消息一樣,並且最后一條消息實際上優先於前兩條消息。

要解決此問題,您必須為每條消息包含某種消息長度前綴。 通常,這是通過為每個消息添加一個存儲其長度的varint來完成的。 這個來自Kenton Varda的代碼是一個很好的例子,說明如何在C ++中做到這一點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM