Hi, I am trying to string up multiple messages of different C++ built-in types into one message. Conceptually, it's something like:
codedstream << int_x << float_y << double_z; I am thinking of implementing: ===================== .proto File ===================== enum Type { // Enums that correspond to // C++ built-in types Tint = 0; Tdouble = 0; Tfloat = 0; } Proto_int { required int val = 1; } Proto_double { required double val = 1; } Proto_float { required float val = 1; } ===================== C++ code to write built-in types to protobuf ===================== sos = new StringOutputStream(&buf); out = new CodedOutputStream(&sos); ... // We want to write all 3 of these in ONE protobuf message double d = 123.0; int i = 456; float f = 789.0f; // Create the messages Proto_int msg_int; Proto_double msg_double; Proto_float msg_float; msg_int.set_val(i); msg_double.set_val(d); msg_float.set_val(f); // Write out the messages: // 1. First, write out the size of the message ... out->WriteVarint32(sizeof(msg_int)); // 2. then the type (so that we know how to parse it when we read back) ... // QUESTION: WriteVarint32 is used to write ints, what should I use to // write double/float? out->WriteVarint32(Tint); // 3. then the message itself msg_int.SerializeToCodedStream(&out); // Then repeat 1 - 3 for double and float, using msg_double/Tdouble and msg_float/Tfloat respectively. ===================== code to READ from protobuf and reconstruct built-in types ===================== bool read() { ArrayInputStream ais(static_cast<const void *>(&buf[0]), buf.size()); CodedInputStream in(&ais); google::protobuf::uint32 type = 0; google::protobuf::uint32 size = 0; if (!in.ReadVarint32(&size)) return false; while(size) { if (!in.ReadVarint32(&type)) return false; CodedInputStream::Limit limit = in.PushLimit(size); switch(type) { case Tdouble: { Proto_double p; p.ParseFromCodedStream(&in); } break; ... similar code for Tint and Tfloat } ===================== Question ===================== The above scheme feels very inefficient, and I suspect I am probably doing it wrong. For example, do I really need to make dummy wrappers like this: "Proto_int { required int val = 1; }" What is the correct way to achieve my goal stated above? -- You received this message because you are subscribed to the Google Groups "Protocol Buffers" group. To post to this group, send email to proto...@googlegroups.com. To unsubscribe from this group, send email to protobuf+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/protobuf?hl=en.