I suspect the problem is that the array you're creating for the serialized data is too small. That message's serialized size is only 2 bytes, so gzipping it will likely increase the size, and the gzipped data will not fit in a 2-byte array. I would recommend serializing to a std::string using a StringOutputStream, since that will automatically resize the string.
On Thu, Jul 4, 2019 at 3:13 AM HyonChang Lim <[email protected]> wrote: > I'm testing protobuf with zlib compression. > > > I wrote some c++ sample code using protobuf 3.8.0, but the following error > occurred at calling ParseFromZeroCopyStream() at Ubuntu. > > > terminate called after throwing an instance of 'std::system_error' > what(): Unknown error -1(core dumped) > > > what can I do? > > > I tried to replace ParseFromZeroCopyStream() with > ParseFromBoundedZeroCopyStream(). That results in no core dump, but > ParseFromBoundedZeroCopyStream() returned false. > > > *test.proto* > > syntax = "proto2"; > package test; > > message Msg{ > required uint32 data = 1;} > > > *test.cc* > > #include <iostream>#include > <google/protobuf/io/zero_copy_stream_impl.h>#include > <google/protobuf/io/zero_copy_stream_impl_lite.h>#include > <google/protobuf/io/gzip_stream.h>#include "test.pb.h" > using namespace std;using namespace google::protobuf;using namespace test; > int main(void){ > Msg srcMsg; > srcMsg.set_data(1); > > long sSize = srcMsg.ByteSizeLong(); > cout << "SerializedSize = " << sSize << endl; > > char * compressedMsg = new char[sSize]; > io::ArrayOutputStream aos(compressedMsg, sSize); > io::GzipOutputStream gos(&aos); > > long cSize; > if (srcMsg.SerializeToZeroCopyStream(&gos) == true) > { > gos.Close(); > cSize = aos.ByteCount(); > cout << "compression success : " << cSize << " bytes" << endl; > } > else > { > cout << "compression error" << endl; > return 1; > } > > Msg targetMsg; > > io::ArrayInputStream ais(compressedMsg, cSize); > io::GzipInputStream gis(&ais); > > if (targetMsg.ParseFromZeroCopyStream(&gis) == false) > { > cout << "decompression error" << endl; > } > else > { > cout << "decompression success : " << targetMsg.ByteSizeLong() << " > bytes" << endl; > cout << "data = " << targetMsg.data() << endl; > } > > delete[] compressedMsg; > > return 0;} > > > I expect that decompression succeeds. > > -- > You received this message because you are subscribed to the Google Groups > "Protocol Buffers" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > To post to this group, send email to [email protected]. > Visit this group at https://groups.google.com/group/protobuf. > To view this discussion on the web visit > https://groups.google.com/d/msgid/protobuf/8b697653-58dd-46c5-b442-aa4b76388c04%40googlegroups.com > <https://groups.google.com/d/msgid/protobuf/8b697653-58dd-46c5-b442-aa4b76388c04%40googlegroups.com?utm_medium=email&utm_source=footer> > . > For more options, visit https://groups.google.com/d/optout. > -- You received this message because you are subscribed to the Google Groups "Protocol Buffers" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at https://groups.google.com/group/protobuf. To view this discussion on the web visit https://groups.google.com/d/msgid/protobuf/CADqAXr6q2zY3rhzJCdWMMnSKY8k4GYg26x6-h6B7VtW3QY9xrw%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.
