Google_Protobuf协议——protobuf代码中的通讯

在类google::protobuf::Message中有protobuf通讯的函数,将信息序列化和反序列化,在由proto文件生成的.cc和.h文件中,消息体生成由命名空间匡制,继承google::protobuf::Message的类。
在生成的test.pb.h中

/* @@protoc_insertion_point(class_definition:zxtest.prototest.TestSend) */
class TestSend : public ::google::protobuf::Message  {
 public:
  TestSend();
  virtual ~TestSend();

  TestSend(const TestSend& from);

  ...
 }

序列化和反序列化

序列化函数组

//序列化到编码流
bool SerializeToCodedStream(io::CodedOutputStream* output) const;
//序列化到字符串
bool SerializeToString(string* output) const;
//序列化为字符串
string SerializeAsString() const;
//序列化到数组
bool SerializeToArray(void* data, int size) const;

反序列化数组

//编码流反序列化
bool ParseFromCodedStream(io::CodedInputStream* input);
//字符串反序列化
bool ParseFromString(const string& data);
//数组反序列化
bool ParseFromArray(const void* data, int size);

计算序列化后的长度

  int ByteSize() const {
    return internal::ToIntSize(ByteSizeLong());
}

代码实现

定义发送与接收基类以及函数

google::protobuf::Message buffmessage;

protobufsend(google::protobuf::Message &buffmessage);
protobufreceive(google::protobuf::Message &buffmessage);

序列化到数组

    int p_buffer_size = buffmessage.ByteSize();
    if (0 == p_buffer_size)
        throw std::string("ByteSize is zero!!!");

    char *p_buffer = new char[p_buffer_size];
    if (!p_buffer)
        throw std::string("new buffer is error!!!");

    if (!buffmessage.SerializeToArray(p_buffer, p_buffer_size))
    {
        delete p_buffer;
        p_buffer = nullptr;
        p_buffer_size = 0;
        throw std::string("SerializeToArray is error!!!");
    }

数组反序列化

    if (!buffmessage.ParseFromArray(p_buffer,p_buffer_size))
    {
        delete p_buffer;
        p_buffer = nullptr;
        p_buffer_size = 0;
        throw std::string("ParseFromArray is error!!!");
    }

序列化到字符串

    std::string strbuffer = buffmessage.SerializeAsString();
    if (strbuffer.empty())
    {
        throw std::string("SerializeAsString is error!!!");
    }

    std::string strbuffer("");
    if (!buffmessage.SerializeToString(&strbuffer))
        throw std::string("SerializeToString is error!!!");

字符串反序列化

    if (!buffmessage.ParseFromString(strbuffer))
    {
        strbuffer.clear();
        throw std::string("ParseFromString is empty!!!");
    }

猜你喜欢

转载自blog.csdn.net/zxng_work/article/details/78943167