在类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!!!");
}