Protobuf协议

Protobuf协议,第1张

在网络通信中,我们经常需要通过一种约定俗称的方式来进行数据交互。在这中间,有很多如xml,json等等很常见的数据格式。

xml是一种标签语言,通过<tag>content</tag>来描述数据内容,出现时间最早,应用最广泛,但是传输效率低。

json作为一种轻量级的数据交换格式,其无效的字符数远远低于xml,且原生被js支持,故经常出现在前端请求中以及app与服务器的数据交互。

protobuf是google的一种数据交换格式,相比于其他的几种交互方式,其优势在于数据的重编码,在传输时会将其编译为二进制数据流,而当需要使用时再进行反序列化。

protobuf支持几乎绝大多数的语言。

通过proto文件,我们可以了解到一个数据的详细类型。

在官方示例中可以看到一个数据类型的声明方法:message 对象 {}。在{}中则是添加相应的字段描述,每个字段描述如下

数据类型为protobuf声明的数据类型,每个类型在不同的语言上均有特定的映射。

或可以是一个声明的自定义数据类型。

声明完成后通过protoc编译为特定语言的头文件。

引入头文件后 首先声明一个对象

通过person.xxx可以直接对某个字段进行赋值

在序列化过程中有可能因为required未被赋值而导致序列化失败

序列化成功后便可以将二进制数据发送出去

收到对应的数据后,我们需要从二进制数据中获取对应的对象

person = addressbook_pb2.Person()

person.ParseFromString(pb_bin)

classLogonReqMessage:public::google::protobuf::MessageLite{public:LogonReqMessage()virtual~LogonReqMessage()//implementsMessage----------------------------------------------//下面的成员函数均实现自MessageLite中的虚函数。//创建一个新的LogonReqMessage对象,等同于clone。LogonReqMessage*New()const//用另外一个LogonReqMessage对象初始化当前对象,等同于赋值 *** 作符重载(operator=)voidCopyFrom(constLogonReqMessage&from)//清空当前对象中的所有数据,既将所有成员变量置为未初始化状态。voidClear()//判断当前状态是否已经初始化。boolIsInitialized()const//在给当前对象的所有变量赋值之后,获取该对象序列化后所需要的字节数。intByteSize()const//获取当前对象的类型名称。::std::stringGetTypeName()const//requiredint64acctID=1//下面的成员函数都是因message中定义的acctID字段而生成。//这个静态成员表示AcctID的标签值。命名规则是k+FieldName(驼峰规则)+FieldNumber。staticconstintkAcctIDFieldNumber=1//如果acctID字段已经被设置返回true,否则false。inlineboolhas_acctid()const//执行该函数后has_acctid函数将返回false,而下面的acctid函数则返回acctID的缺省值。inlinevoidclear_acctid()//返回acctid字段的当前值,如果没有设置则返回int64类型的缺省值。inline::google::protobuf::int64acctid()const//为acctid字段设置新值,调用该函数后has_acctid函数将返回true。inlinevoidset_acctid(::google::protobuf::int64value)//requiredstringpasswd=2//下面的成员函数都是因message中定义的passwd字段而生成。这里生成的函数和上面acctid//生成的那组函数基本相似。因此这里只是列出差异部分。staticconstintkPasswdFieldNumber=2inlineboolhas_passwd()constinlinevoidclear_passwd()inlineconst::std::string&passwd()constinlinevoidset_passwd(const::std::string&value)//对于字符串类型字段设置constchar*类型的变量值。inlinevoidset_passwd(constchar*value)inlinevoidset_passwd(constchar*value,size_tsize)//可以通过返回值直接给passwd对象赋值。在调用该函数之后has_passwd将返回true。inline::std::string*mutable_passwd()//释放当前对象对passwd字段的所有权,同时返回passwd字段对象指针。调用此函数之后,passwd字段对象//的所有权将移交给调用者。此后再调用has_passwd函数时将返回false。inline::std::string*release_passwd()private:}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/bake/11535196.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存