Running protobuf 3.9.0 on Windows with VS2017, I'm trying to serialize and deserialize my protobuf model using CodedOutputStream and CodedInputStream in C++, but the decoder always gives me an empty result. I use length-prefixing and can read the size from the stream on the decoder side. An in-place encode/decode source code is as follows, where the Any message is used
import "google/protobuf/any.proto";
message Pouch {
google.protobuf.Any msg = 1;
}
bool EncodeDecode(google::protobuf::Message* pMeta, std::string& out_packet) {
//
// Encoding
//
// CAUTION:
// - Must dynamic allocate to avoid protobuf bug <SharedDtor crash #435>.
std::shared_ptr<Pouch> pPayload = std::make_shared<Pouch>();
google::protobuf::Any env;
env.PackFrom(*pMeta);
pPayload->set_allocated_msg(&env);
// Prefix with size
const int nTipBytes = 4;
int nBytesMsg = (int)pMeta->ByteSizeLong();
int nBytesPacket = nBytesMsg + nTipBytes;
out_packet.assign(nBytesPacket, '\0');
google::protobuf::io::ArrayOutputStream aos((void*)out_packet.c_str(), nBytesPacket);
google::protobuf::io::CodedOutputStream cos(&aos);
cos.WriteVarint32(nBytesMsg);
bool res = pMeta->SerializeToCodedStream(&cos);
printf("payload has message: %d\n", pPayload->has_msg());
//
// Decoding
//
Pouch out_pouch;
google::protobuf::io::ArrayInputStream ais(out_packet.c_str(), nBytesPacket);
google::protobuf::io::CodedInputStream cis(&ais);
google::protobuf::uint32 nPayloadBytes;
cis.ReadVarint32(&nPayloadBytes);
google::protobuf::io::CodedInputStream::Limit msgLimit = cis.PushLimit(nPayloadBytes);
res = out_pouch.ParseFromCodedStream(&cis);
cis.PopLimit(msgLimit);
printf("decoded payload has message: %d\n", out_pouch.has_msg());
pPayload->release_msg();
return res;
}
The above code prints out an empty type URL
payload has message: 1
decoded payload has message: 0
But the size-prefix nPayloadBytes gives the correct number.
The results from encoding and decoding are both true.
Where am I wrong?