JSON

Protocol Buffer技术深入理解(C++实例)(2)

字号+ 作者:H5之家 来源:H5之家 2017-10-17 14:17 我要评论( )

class LogonRespMessage : public ::google::protobuf::MessageLite { public: LogonRespMessage(); virtual ~LogonRespMessage(); // implements Message ---------------------------------------------- ... ...


class LogonRespMessage : public ::google::protobuf::MessageLite {
public:
LogonRespMessage();
virtual ~LogonRespMessage();
// implements Message ----------------------------------------------
... ... //这部分函数和之前的例子一样。
// required .LoginResult logonResult = 1;
//下面的成员函数都是因message中定义的logonResult字段而生成。
//这一点和前面的例子基本相同,只是类型换做了枚举类型LoginResult。
static const int kLogonResultFieldNumber = 1;
inline bool has_logonresult() const;
inline void clear_logonresult();
inline LoginResult logonresult() const;
inline void set_logonresult(LoginResult value);
// required .UserInfo userInfo = 2;
//下面的成员函数都是因message中定义的UserInfo字段而生成。
//这里只是列出和非消息类型字段差异的部分。
static const int kUserInfoFieldNumber = 2;
inline bool has_userinfo() const;
inline void clear_userinfo();
inline const ::UserInfo& userinfo() const;
//可以看到该类并没有生成用于设置和修改userInfo字段set_userinfo函数,而是将该工作
//交给了下面的mutable_userinfo函数。因此每当调用函数之后,Protocol Buffer都会认为
//该字段的值已经被设置了,同时has_userinfo函数亦将返回true。在实际编码中,我们可以
//通过该函数返回userInfo字段的内部指针,并基于该指针完成userInfo成员变量的初始化工作。
inline ::UserInfo* mutable_userinfo();
inline ::UserInfo* release_userinfo();
private:
... ...
};


下面是读写LogonRespMessage对象的C++测试代码和说明性注释。

复制代码 代码如下:


void testNestedMessage()
{
printf("==================This is nested message.================\n");
LogonRespMessage logonResp;
logonResp.set_logonresult(LOGON_RESULT_SUCCESS);
//如上所述,通过mutable_userinfo函数返回userInfo字段的指针,之后再初始化该对象指针。
UserInfo* userInfo = logonResp.mutable_userinfo();
userInfo->set_acctid(200);
userInfo->set_name("Tester");
userInfo->set_status(OFFLINE);
int length = logonResp.ByteSize();
char* buf = new char[length];
logonResp.SerializeToArray(buf,length);
LogonRespMessage logonResp2;
logonResp2.ParseFromArray(buf,length);
printf("LogonResult = %d, UserInfo->acctID = %I64d, UserInfo->name = %s, UserInfo->status = %d\n"
,logonResp2.logonresult(),logonResp2.userinfo().acctid(),logonResp2.userinfo().name().c_str(),logonResp2.userinfo().status());
delete [] buf;
}


四、repeated嵌套message生成的C++代码
message BuddyInfo {
required UserInfo userInfo = 1;
required int32 groupID = 2;
}
message RetrieveBuddiesResp {
required int32 buddiesCnt = 1;
repeated BuddyInfo buddiesInfo = 2;
}
对于上述消息生成的代码,我们将只是针对RetrieveBuddiesResp消息所对应的C++代码进行详细说明,其余部分和前面小节的例子基本相同,可直接参照。而对于RetrieveBuddiesResp类中的代码,我们也仅仅是对buddiesInfo字段生成的代码进行更为详细的解释。

复制代码 代码如下:


class RetrieveBuddiesResp : public ::google::protobuf::MessageLite {
public:
RetrieveBuddiesResp();
virtual ~RetrieveBuddiesResp();
... ... //其余代码的功能性注释均可参照前面的例子。
// repeated .BuddyInfo buddiesInfo = 2;
static const int kBuddiesInfoFieldNumber = 2;
//返回数组中成员的数量。
inline int buddiesinfo_size() const;
//清空数组中的所有已初始化成员,调用该函数后,buddiesinfo_size函数将返回0。
inline void clear_buddiesinfo();
//返回数组中指定下标所包含元素的引用。
inline const ::BuddyInfo& buddiesinfo(int index) const;
//返回数组中指定下标所包含元素的指针,通过该方式可直接修改元素的值信息。
inline ::BuddyInfo* mutable_buddiesinfo(int index);
//像数组中添加一个新元素。返回值即为新增的元素,可直接对其进行初始化。
inline ::BuddyInfo* add_buddiesinfo();
//获取buddiesInfo字段所表示的容器,该函数返回的容器仅用于遍历并读取,不能直接修改。
inline const ::google::protobuf::RepeatedPtrField< ::BuddyInfo >&
buddiesinfo() const;
//获取buddiesInfo字段所表示的容器指针,该函数返回的容器指针可用于遍历和直接修改。
inline ::google::protobuf::RepeatedPtrField< ::BuddyInfo >*
mutable_buddiesinfo();
private:
... ...
};


下面是读写RetrieveBuddiesResp对象的C++测试代码和说明性注释。

复制代码 代码如下:

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • 使用Protocol Buffers代替JSON的五个原因

    使用Protocol Buffers代替JSON的五个原因

    2015-10-28 17:00

网友点评