码迷,mamicode.com
首页 > 其他好文 > 详细

probuf 学习之二

时间:2015-06-29 19:47:43      阅读:306      评论:0      收藏:0      [点我收藏+]

标签:

.proto 文件是这样的 

package http;


message user_info
{
   required int32  _id=1;
   required string _loginame=2;
   required string _nickname=3;
   required string _realname=4;
   required string _email=5;
   required string _mobile=6;
   required string _portraitcrc=7;
   required string _impresa=8;
   required int32  _optype=9 ;   //看这个值的变化
}

message user_tab
{
    repeated user_info user=1;
}

 

repeated

inline int user_info::_optype_size() const {     //与required不同的
  return _optype_.size();
}
inline void user_info::clear__optype() {
  _optype_.Clear();
}
inline ::google::protobuf::int32 user_info::_optype(int index) const {
  return _optype_.Get(index);
}
inline void user_info::set__optype(int index, ::google::protobuf::int32 value) {
  _optype_.Set(index, value);
}
inline void user_info::add__optype(::google::protobuf::int32 value) {
  _optype_.Add(value);
}
inline const ::google::protobuf::RepeatedField< ::google::protobuf::int32 >&
user_info::_optype() const {
  return _optype_;
}
inline ::google::protobuf::RepeatedField< ::google::protobuf::int32 >*
user_info::mutable__optype() {
  return &_optype_;
}

optional 

// optional int32 _optype = 9 [default = 0];
inline bool user_info::has__optype() const {
  return (_has_bits_[0] & 0x00000100u) != 0;
}
inline void user_info::set_has__optype() {
  _has_bits_[0] |= 0x00000100u;
}
inline void user_info::clear_has__optype() {
  _has_bits_[0] &= ~0x00000100u;
}
inline void user_info::clear__optype() {
  _optype_ = 0;
  clear_has__optype();
}
inline ::google::protobuf::int32 user_info::_optype() const {
  return _optype_;
}
inline void user_info::set__optype(::google::protobuf::int32 value) {
  set_has__optype();
  _optype_ = value;
}

required

// required int32 _optype = 9;
inline bool user_info::has__optype() const {
  return (_has_bits_[0] & 0x00000100u) != 0;
}
inline void user_info::set_has__optype() {
  _has_bits_[0] |= 0x00000100u;
}
inline void user_info::clear_has__optype() {
  _has_bits_[0] &= ~0x00000100u;
}
inline void user_info::clear__optype() {
  _optype_ = 0;
  clear_has__optype();
}
inline ::google::protobuf::int32 user_info::_optype() const {
  return _optype_;
}
inline void user_info::set__optype(::google::protobuf::int32 value) {
  set_has__optype();
  _optype_ = value;
}

 

required:一个格式良好的消息一定要含有1个这种字段。表示该值是必须要设置的;

optional:消息格式中该字段可以有0个或1个值(不超过1个)。

repeated:在一个格式良好的消息中,这种字段可以重复任意多次(包括0次)。重复的值的顺序会被保留。表示该值可以重复。

进一步说明:

Required: 表示是一个必须字段,必须相对于发送方,在发送消息之前必须设置该字段的值,对于接收方,必须能够识别该字段的意思。发送之前没有设置required字段或者无法识别required字段都会引发编解码异常,导致消息被丢弃。

Optional:表示是一个可选字段,可选对于发送方,在发送消息时,可以有选择性的设置或者不设置该字段的值。对于接收方,如果能够识别可选字段就进行相应的处理,如果无法识别,则忽略该字段,消息中的其它字段正常处理。---因为optional字段的特性,很多接口在升级版本中都把后来添加的字段都统一的设置为optional字段,这样老的版本无需升级程序也可以正常的与新的软件进行通信,只不过新的字段无法识别而已,因为并不是每个节点都需要新的功能,因此可以做到按需升级和平滑过渡。

Repeated:表示该字段可以包含0~N个元素。其特性和optional一样,但是每一次可以包含多个值。可以看作是在传递一个数组的值。

主要看repeated的情况:

repeated就像是一个vector,我们可以添加元素,知道这个vector的大小,还能够返回对应下标的元素;

inline int user_info::_optype_size() const {     //与required不同的
  return _optype_.size();
}
inline void user_info::add__optype(::google::protobuf::int32 value) {//添加元素
  _optype_.Add(value);
}
inline ::google::protobuf::int32 user_info::_optype(int index) const {//获取对应下标的值
  return _optype_.Get(index);
}

由于一些历史原因,基本数值类型的repeated的字段并没有被尽可能地高效编码。在新的代码中,用户应该使用特殊选项[packed=true]来保证更高效的编码。

required是永久性的:在将一个字段标识为required的时候,应该特别小心。如果在某些情况下不想写入或者发送一个required的 字段,将原始该字段修饰符更改为optional可能会遇到问题——旧版本的使用者会认为不含该字段的消息是不完整的,从而可能会无目的的拒绝解析。在这 种情况下,你应该考虑编写特别针对于应用程序的、自定义的消息校验函数。Google的一些工程师得出了一个结论:使用required弊多于利;他们更 愿意使用optional和repeated而不是required。当然,这个观点并不具有普遍性。

 

probuf 学习之二

标签:

原文地址:http://www.cnblogs.com/zhouyuqing-blog/p/4608142.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!