-
Notifications
You must be signed in to change notification settings - Fork 0
Protobuf Serialisation
Agent57 edited this page Jan 4, 2016
·
4 revisions
int main() {
GOOGLE_PROTOBUF_VERIFY_VERSION;
{
std::vector<Chunk> chunks = createChunks(NUM_CHUNKS, CHUNK_SIZE);
std::ofstream output("D:\\temp.bin", std::ios::binary);
OstreamOutputStream raw_output(&output);
for (Chunk& chunk : chunks) {
if (!writeDelimitedTo(chunk, &raw_output)){
std::cout << "Unable to write chunk\n";
return 1;
}
}
}
{
std::ifstream input("D:\\temp.bin", std::ios::binary);
IstreamInputStream raw_input(&input);
std::vector<Chunk> chunks(NUM_CHUNKS);
for (auto& chunk : chunks) {
if (!readDelimitedFrom(&raw_input, &chunk)) {
std::cout << "Unable to read chunk\n";
return 1;
}
}
std::cout << "Num values in first chunk " << chunks[0].values_size() << "\n";
}
google::protobuf::ShutdownProtobufLibrary();
}
bool writeDelimitedTo (const google::protobuf::MessageLite& message,
google::protobuf::io::ZeroCopyOutputStream* rawOutput)
{
google::protobuf::io::CodedOutputStream output(rawOutput);
// Write the size.
const int size = message.ByteSize();
output.WriteVarint32(size);
uint8_t* buffer = output.GetDirectBufferForNBytesAndAdvance(size);
if (buffer != NULL)
{
// Optimization: The message fits in one buffer, so use the faster
// direct-to-array serialization path.
message.SerializeWithCachedSizesToArray(buffer);
}
else
{
// Slightly-slower path when the message is multiple buffers.
message.SerializeWithCachedSizes(&output);
if (output.HadError())
return false;
}
return true;
}
bool readDelimitedFrom (google::protobuf::io::ZeroCopyInputStream* rawInput,
google::protobuf::MessageLite* message)
{
google::protobuf::io::CodedInputStream input(rawInput);
// Read the size.
uint32_t size;
if (!input.ReadVarint32(&size))
return false;
// Tell the stream not to read beyond that size.
auto limit = input.PushLimit(size);
// Parse the message.
if (!message->MergePartialFromCodedStream(&input))
return false;
if (!input.ConsumedEntireMessage())
return false;
// Release the limit.
input.PopLimit(limit);
return true;
}