• protobuf practice


    https://www.ibm.com/developerworks/cn/linux/l-cn-gpb/

    三点:
    1. 编写proto文件
    2. 编译proto生成对应语言的实现
    3. 在需求代码中引入2中的实现

    1. 编写proto文件
    清单 1. lm.helloworld.proto 文件 package lm; message helloworld { required int32 id = 1; // ID required string str = 2; // str optional int32 opt = 3; //optional field }

    2. 编译proto生成对应语言的实现
    编译 protoc --cpp_out=. lm.helloworld.proto
    生成 lm.helloworld.pb.h 和 lm.helloworld.pb.cc,这两个文件为对应lm.helloworld.proto文件内部相关数据结构的类实现,直接在功能代码中使用。
    class helloworld : public ::google::protobuf::Message
    proto文件生成的对应类,是继承于google::protobuf相关的类,携带有大量很好的操作方法。
    如:string DebugString() const;
      1 // Generated by the protocol buffer compiler.  DO NOT EDIT!
      2 // source: lm.helloworld.proto
      3 
      4 #ifndef PROTOBUF_lm_2ehelloworld_2eproto__INCLUDED
      5 #define PROTOBUF_lm_2ehelloworld_2eproto__INCLUDED
      6 
      7 #include <string>
      8 
      9 #include <google/protobuf/stubs/common.h>
     10 
     11 #if GOOGLE_PROTOBUF_VERSION < 2006000
     12 #error This file was generated by a newer version of protoc which is
     13 #error incompatible with your Protocol Buffer headers.  Please update
     14 #error your headers.
     15 #endif
     16 #if 2006001 < GOOGLE_PROTOBUF_MIN_PROTOC_VERSION
     17 #error This file was generated by an older version of protoc which is
     18 #error incompatible with your Protocol Buffer headers.  Please
     19 #error regenerate this file with a newer version of protoc.
     20 #endif
     21 
     22 #include <google/protobuf/generated_message_util.h>
     23 #include <google/protobuf/message.h>
     24 #include <google/protobuf/repeated_field.h>
     25 #include <google/protobuf/extension_set.h>
     26 #include <google/protobuf/unknown_field_set.h>
     27 // @@protoc_insertion_point(includes)
     28 
     29 namespace lm {
     30 
     31 // Internal implementation detail -- do not call these.
     32 void  protobuf_AddDesc_lm_2ehelloworld_2eproto();
     33 void protobuf_AssignDesc_lm_2ehelloworld_2eproto();
     34 void protobuf_ShutdownFile_lm_2ehelloworld_2eproto();
     35 
     36 class helloworld;
     37 
     38 // ===================================================================
     39 
     40 class helloworld : public ::google::protobuf::Message {
     41  public:
     42   helloworld();
     43   virtual ~helloworld();
     44 
     45   helloworld(const helloworld& from);
     46 
     47   inline helloworld& operator=(const helloworld& from) {
     48     CopyFrom(from);
     49     return *this;
     50   }
     51 
     52   inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {
     53     return _unknown_fields_;
     54   }
     55 
     56   inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {
     57     return &_unknown_fields_;
     58   }
     59 
     60   static const ::google::protobuf::Descriptor* descriptor();
     61   static const helloworld& default_instance();
     62 
     63   void Swap(helloworld* other);
     64 
     65   // implements Message ----------------------------------------------
     66 
     67   helloworld* New() const;
     68   void CopyFrom(const ::google::protobuf::Message& from);
     69   void MergeFrom(const ::google::protobuf::Message& from);
     70   void CopyFrom(const helloworld& from);
     71   void MergeFrom(const helloworld& from);
     72   void Clear();
     73   bool IsInitialized() const;
     74 
     75   int ByteSize() const;
     76   bool MergePartialFromCodedStream(
     77       ::google::protobuf::io::CodedInputStream* input);
     78   void SerializeWithCachedSizes(
     79       ::google::protobuf::io::CodedOutputStream* output) const;
     80   ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;
     81   int GetCachedSize() const { return _cached_size_; }
     82   private:
     83   void SharedCtor();
     84   void SharedDtor();
     85   void SetCachedSize(int size) const;
     86   public:
     87   ::google::protobuf::Metadata GetMetadata() const;
     88 
     89   // nested types ----------------------------------------------------
     90 
     91   // accessors -------------------------------------------------------
     92 
     93   // required int32 id = 1;
     94   inline bool has_id() const;
     95   inline void clear_id();
     96   static const int kIdFieldNumber = 1;
     97   inline ::google::protobuf::int32 id() const;
     98   inline void set_id(::google::protobuf::int32 value);
     99 
    100   // required string str = 2;
    101   inline bool has_str() const;
    102   inline void clear_str();
    103   static const int kStrFieldNumber = 2;
    104   inline const ::std::string& str() const;
    105   inline void set_str(const ::std::string& value);
    106   inline void set_str(const char* value);
    107   inline void set_str(const char* value, size_t size);
    108   inline ::std::string* mutable_str();
    109   inline ::std::string* release_str();
    110   inline void set_allocated_str(::std::string* str);
    111 
    112   // optional int32 opt = 3;
    113   inline bool has_opt() const;
    114   inline void clear_opt();
    115   static const int kOptFieldNumber = 3;
    116   inline ::google::protobuf::int32 opt() const;
    117   inline void set_opt(::google::protobuf::int32 value);
    118 
    119   // @@protoc_insertion_point(class_scope:lm.helloworld)
    120  private:
    121   inline void set_has_id();
    122   inline void clear_has_id();
    123   inline void set_has_str();
    124   inline void clear_has_str();
    125   inline void set_has_opt();
    126   inline void clear_has_opt();
    127 
    128   ::google::protobuf::UnknownFieldSet _unknown_fields_;
    129 
    130   ::google::protobuf::uint32 _has_bits_[1];
    131   mutable int _cached_size_;
    132   ::std::string* str_;
    133   ::google::protobuf::int32 id_;
    134   ::google::protobuf::int32 opt_;
    135   friend void  protobuf_AddDesc_lm_2ehelloworld_2eproto();
    136   friend void protobuf_AssignDesc_lm_2ehelloworld_2eproto();
    137   friend void protobuf_ShutdownFile_lm_2ehelloworld_2eproto();
    138 
    139   void InitAsDefaultInstance();
    140   static helloworld* default_instance_;
    141 };
    142 // ===================================================================
    143 
    144 
    145 // ===================================================================
    146 
    147 // helloworld
    148 
    149 // required int32 id = 1;
    150 inline bool helloworld::has_id() const {
    151   return (_has_bits_[0] & 0x00000001u) != 0;
    152 }
    153 inline void helloworld::set_has_id() {
    154   _has_bits_[0] |= 0x00000001u;
    155 }
    156 inline void helloworld::clear_has_id() {
    157   _has_bits_[0] &= ~0x00000001u;
    158 }
    159 inline void helloworld::clear_id() {
    160   id_ = 0;
    161   clear_has_id();
    162 }
    163 inline ::google::protobuf::int32 helloworld::id() const {
    164   // @@protoc_insertion_point(field_get:lm.helloworld.id)
    165   return id_;
    166 }
    167 inline void helloworld::set_id(::google::protobuf::int32 value) {
    168   set_has_id();
    169   id_ = value;
    170   // @@protoc_insertion_point(field_set:lm.helloworld.id)
    171 }
    172 
    173 // required string str = 2;
    174 inline bool helloworld::has_str() const {
    175   return (_has_bits_[0] & 0x00000002u) != 0;
    176 }
    177 inline void helloworld::set_has_str() {
    178   _has_bits_[0] |= 0x00000002u;
    179 }
    180 inline void helloworld::clear_has_str() {
    181   _has_bits_[0] &= ~0x00000002u;
    182 }
    183 inline void helloworld::clear_str() {
    184   if (str_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) {
    185     str_->clear();
    186   }
    187   clear_has_str();
    188 }
    189 inline const ::std::string& helloworld::str() const {
    190   // @@protoc_insertion_point(field_get:lm.helloworld.str)
    191   return *str_;
    192 }
    193 inline void helloworld::set_str(const ::std::string& value) {
    194   set_has_str();
    195   if (str_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) {
    196     str_ = new ::std::string;
    197   }
    198   str_->assign(value);
    199   // @@protoc_insertion_point(field_set:lm.helloworld.str)
    200 }
    201 inline void helloworld::set_str(const char* value) {
    202   set_has_str();
    203   if (str_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) {
    204     str_ = new ::std::string;
    205   }
    206   str_->assign(value);
    207   // @@protoc_insertion_point(field_set_char:lm.helloworld.str)
    208 }
    209 inline void helloworld::set_str(const char* value, size_t size) {
    210   set_has_str();
    211   if (str_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) {
    212     str_ = new ::std::string;
    213   }
    214   str_->assign(reinterpret_cast<const char*>(value), size);
    215   // @@protoc_insertion_point(field_set_pointer:lm.helloworld.str)
    216 }
    217 inline ::std::string* helloworld::mutable_str() {
    218   set_has_str();
    219   if (str_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) {
    220     str_ = new ::std::string;
    221   }
    222   // @@protoc_insertion_point(field_mutable:lm.helloworld.str)
    223   return str_;
    224 }
    225 inline ::std::string* helloworld::release_str() {
    226   clear_has_str();
    227   if (str_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) {
    228     return NULL;
    229   } else {
    230     ::std::string* temp = str_;
    231     str_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
    232     return temp;
    233   }
    234 }
    235 inline void helloworld::set_allocated_str(::std::string* str) {
    236   if (str_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) {
    237     delete str_;
    238   }
    239   if (str) {
    240     set_has_str();
    241     str_ = str;
    242   } else {
    243     clear_has_str();
    244     str_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
    245   }
    246   // @@protoc_insertion_point(field_set_allocated:lm.helloworld.str)
    247 }
    248 
    249 // optional int32 opt = 3;
    250 inline bool helloworld::has_opt() const {
    251   return (_has_bits_[0] & 0x00000004u) != 0;
    252 }
    253 inline void helloworld::set_has_opt() {
    254   _has_bits_[0] |= 0x00000004u;
    255 }
    256 inline void helloworld::clear_has_opt() {
    257   _has_bits_[0] &= ~0x00000004u;
    258 }
    259 inline void helloworld::clear_opt() {
    260   opt_ = 0;
    261   clear_has_opt();
    262 }
    263 inline ::google::protobuf::int32 helloworld::opt() const {
    264   // @@protoc_insertion_point(field_get:lm.helloworld.opt)
    265   return opt_;
    266 }
    267 inline void helloworld::set_opt(::google::protobuf::int32 value) {
    268   set_has_opt();
    269   opt_ = value;
    270   // @@protoc_insertion_point(field_set:lm.helloworld.opt)
    271 }
    272 
    273 
    274 // @@protoc_insertion_point(namespace_scope)
    275 
    276 }  // namespace lm
    277 
    278 #ifndef SWIG
    279 namespace google {
    280 namespace protobuf {
    281 
    282 
    283 }  // namespace google
    284 }  // namespace protobuf
    285 #endif  // SWIG
    286 
    287 // @@protoc_insertion_point(global_scope)
    288 
    289 #endif  // PROTOBUF_lm_2ehelloworld_2eproto__INCLUDED
    lm.helloworld.pb.h
      1 // Generated by the protocol buffer compiler.  DO NOT EDIT!
      2 // source: lm.helloworld.proto
      3 
      4 #define INTERNAL_SUPPRESS_PROTOBUF_FIELD_DEPRECATION
      5 #include "lm.helloworld.pb.h"
      6 
      7 #include <algorithm>
      8 
      9 #include <google/protobuf/stubs/common.h>
     10 #include <google/protobuf/stubs/once.h>
     11 #include <google/protobuf/io/coded_stream.h>
     12 #include <google/protobuf/wire_format_lite_inl.h>
     13 #include <google/protobuf/descriptor.h>
     14 #include <google/protobuf/generated_message_reflection.h>
     15 #include <google/protobuf/reflection_ops.h>
     16 #include <google/protobuf/wire_format.h>
     17 // @@protoc_insertion_point(includes)
     18 
     19 namespace lm {
     20 
     21 namespace {
     22 
     23 const ::google::protobuf::Descriptor* helloworld_descriptor_ = NULL;
     24 const ::google::protobuf::internal::GeneratedMessageReflection*
     25   helloworld_reflection_ = NULL;
     26 
     27 }  // namespace
     28 
     29 
     30 void protobuf_AssignDesc_lm_2ehelloworld_2eproto() {
     31   protobuf_AddDesc_lm_2ehelloworld_2eproto();
     32   const ::google::protobuf::FileDescriptor* file =
     33     ::google::protobuf::DescriptorPool::generated_pool()->FindFileByName(
     34       "lm.helloworld.proto");
     35   GOOGLE_CHECK(file != NULL);
     36   helloworld_descriptor_ = file->message_type(0);
     37   static const int helloworld_offsets_[3] = {
     38     GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(helloworld, id_),
     39     GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(helloworld, str_),
     40     GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(helloworld, opt_),
     41   };
     42   helloworld_reflection_ =
     43     new ::google::protobuf::internal::GeneratedMessageReflection(
     44       helloworld_descriptor_,
     45       helloworld::default_instance_,
     46       helloworld_offsets_,
     47       GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(helloworld, _has_bits_[0]),
     48       GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(helloworld, _unknown_fields_),
     49       -1,
     50       ::google::protobuf::DescriptorPool::generated_pool(),
     51       ::google::protobuf::MessageFactory::generated_factory(),
     52       sizeof(helloworld));
     53 }
     54 
     55 namespace {
     56 
     57 GOOGLE_PROTOBUF_DECLARE_ONCE(protobuf_AssignDescriptors_once_);
     58 inline void protobuf_AssignDescriptorsOnce() {
     59   ::google::protobuf::GoogleOnceInit(&protobuf_AssignDescriptors_once_,
     60                  &protobuf_AssignDesc_lm_2ehelloworld_2eproto);
     61 }
     62 
     63 void protobuf_RegisterTypes(const ::std::string&) {
     64   protobuf_AssignDescriptorsOnce();
     65   ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(
     66     helloworld_descriptor_, &helloworld::default_instance());
     67 }
     68 
     69 }  // namespace
     70 
     71 void protobuf_ShutdownFile_lm_2ehelloworld_2eproto() {
     72   delete helloworld::default_instance_;
     73   delete helloworld_reflection_;
     74 }
     75 
     76 void protobuf_AddDesc_lm_2ehelloworld_2eproto() {
     77   static bool already_here = false;
     78   if (already_here) return;
     79   already_here = true;
     80   GOOGLE_PROTOBUF_VERIFY_VERSION;
     81 
     82   ::google::protobuf::DescriptorPool::InternalAddGeneratedFile(
     83     "
    23lm.helloworld.proto2202lm"2
    
    helloworld22"
     84     "
    
    02id3001 02(052213
    03str3002 02(	2213
    03opt3003 01(05", 77);
     85   ::google::protobuf::MessageFactory::InternalRegisterGeneratedFile(
     86     "lm.helloworld.proto", &protobuf_RegisterTypes);
     87   helloworld::default_instance_ = new helloworld();
     88   helloworld::default_instance_->InitAsDefaultInstance();
     89   ::google::protobuf::internal::OnShutdown(&protobuf_ShutdownFile_lm_2ehelloworld_2eproto);
     90 }
     91 
     92 // Force AddDescriptors() to be called at static initialization time.
     93 struct StaticDescriptorInitializer_lm_2ehelloworld_2eproto {
     94   StaticDescriptorInitializer_lm_2ehelloworld_2eproto() {
     95     protobuf_AddDesc_lm_2ehelloworld_2eproto();
     96   }
     97 } static_descriptor_initializer_lm_2ehelloworld_2eproto_;
     98 
     99 // ===================================================================
    100 
    101 #ifndef _MSC_VER
    102 const int helloworld::kIdFieldNumber;
    103 const int helloworld::kStrFieldNumber;
    104 const int helloworld::kOptFieldNumber;
    105 #endif  // !_MSC_VER
    106 
    107 helloworld::helloworld()
    108   : ::google::protobuf::Message() {
    109   SharedCtor();
    110   // @@protoc_insertion_point(constructor:lm.helloworld)
    111 }
    112 
    113 void helloworld::InitAsDefaultInstance() {
    114 }
    115 
    116 helloworld::helloworld(const helloworld& from)
    117   : ::google::protobuf::Message() {
    118   SharedCtor();
    119   MergeFrom(from);
    120   // @@protoc_insertion_point(copy_constructor:lm.helloworld)
    121 }
    122 
    123 void helloworld::SharedCtor() {
    124   ::google::protobuf::internal::GetEmptyString();
    125   _cached_size_ = 0;
    126   id_ = 0;
    127   str_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
    128   opt_ = 0;
    129   ::memset(_has_bits_, 0, sizeof(_has_bits_));
    130 }
    131 
    132 helloworld::~helloworld() {
    133   // @@protoc_insertion_point(destructor:lm.helloworld)
    134   SharedDtor();
    135 }
    136 
    137 void helloworld::SharedDtor() {
    138   if (str_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) {
    139     delete str_;
    140   }
    141   if (this != default_instance_) {
    142   }
    143 }
    144 
    145 void helloworld::SetCachedSize(int size) const {
    146   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
    147   _cached_size_ = size;
    148   GOOGLE_SAFE_CONCURRENT_WRITES_END();
    149 }
    150 const ::google::protobuf::Descriptor* helloworld::descriptor() {
    151   protobuf_AssignDescriptorsOnce();
    152   return helloworld_descriptor_;
    153 }
    154 
    155 const helloworld& helloworld::default_instance() {
    156   if (default_instance_ == NULL) protobuf_AddDesc_lm_2ehelloworld_2eproto();
    157   return *default_instance_;
    158 }
    159 
    160 helloworld* helloworld::default_instance_ = NULL;
    161 
    162 helloworld* helloworld::New() const {
    163   return new helloworld;
    164 }
    165 
    166 void helloworld::Clear() {
    167 #define OFFSET_OF_FIELD_(f) (reinterpret_cast<char*>(      
    168   &reinterpret_cast<helloworld*>(16)->f) - 
    169    reinterpret_cast<char*>(16))
    170 
    171 #define ZR_(first, last) do {                              
    172     size_t f = OFFSET_OF_FIELD_(first);                    
    173     size_t n = OFFSET_OF_FIELD_(last) - f + sizeof(last);  
    174     ::memset(&first, 0, n);                                
    175   } while (0)
    176 
    177   if (_has_bits_[0 / 32] & 7) {
    178     ZR_(id_, opt_);
    179     if (has_str()) {
    180       if (str_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) {
    181         str_->clear();
    182       }
    183     }
    184   }
    185 
    186 #undef OFFSET_OF_FIELD_
    187 #undef ZR_
    188 
    189   ::memset(_has_bits_, 0, sizeof(_has_bits_));
    190   mutable_unknown_fields()->Clear();
    191 }
    192 
    193 bool helloworld::MergePartialFromCodedStream(
    194     ::google::protobuf::io::CodedInputStream* input) {
    195 #define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure
    196   ::google::protobuf::uint32 tag;
    197   // @@protoc_insertion_point(parse_start:lm.helloworld)
    198   for (;;) {
    199     ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127);
    200     tag = p.first;
    201     if (!p.second) goto handle_unusual;
    202     switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
    203       // required int32 id = 1;
    204       case 1: {
    205         if (tag == 8) {
    206           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
    207                    ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
    208                  input, &id_)));
    209           set_has_id();
    210         } else {
    211           goto handle_unusual;
    212         }
    213         if (input->ExpectTag(18)) goto parse_str;
    214         break;
    215       }
    216 
    217       // required string str = 2;
    218       case 2: {
    219         if (tag == 18) {
    220          parse_str:
    221           DO_(::google::protobuf::internal::WireFormatLite::ReadString(
    222                 input, this->mutable_str()));
    223           ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
    224             this->str().data(), this->str().length(),
    225             ::google::protobuf::internal::WireFormat::PARSE,
    226             "str");
    227         } else {
    228           goto handle_unusual;
    229         }
    230         if (input->ExpectTag(24)) goto parse_opt;
    231         break;
    232       }
    233 
    234       // optional int32 opt = 3;
    235       case 3: {
    236         if (tag == 24) {
    237          parse_opt:
    238           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
    239                    ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
    240                  input, &opt_)));
    241           set_has_opt();
    242         } else {
    243           goto handle_unusual;
    244         }
    245         if (input->ExpectAtEnd()) goto success;
    246         break;
    247       }
    248 
    249       default: {
    250       handle_unusual:
    251         if (tag == 0 ||
    252             ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
    253             ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {
    254           goto success;
    255         }
    256         DO_(::google::protobuf::internal::WireFormat::SkipField(
    257               input, tag, mutable_unknown_fields()));
    258         break;
    259       }
    260     }
    261   }
    262 success:
    263   // @@protoc_insertion_point(parse_success:lm.helloworld)
    264   return true;
    265 failure:
    266   // @@protoc_insertion_point(parse_failure:lm.helloworld)
    267   return false;
    268 #undef DO_
    269 }
    270 
    271 void helloworld::SerializeWithCachedSizes(
    272     ::google::protobuf::io::CodedOutputStream* output) const {
    273   // @@protoc_insertion_point(serialize_start:lm.helloworld)
    274   // required int32 id = 1;
    275   if (has_id()) {
    276     ::google::protobuf::internal::WireFormatLite::WriteInt32(1, this->id(), output);
    277   }
    278 
    279   // required string str = 2;
    280   if (has_str()) {
    281     ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
    282       this->str().data(), this->str().length(),
    283       ::google::protobuf::internal::WireFormat::SERIALIZE,
    284       "str");
    285     ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(
    286       2, this->str(), output);
    287   }
    288 
    289   // optional int32 opt = 3;
    290   if (has_opt()) {
    291     ::google::protobuf::internal::WireFormatLite::WriteInt32(3, this->opt(), output);
    292   }
    293 
    294   if (!unknown_fields().empty()) {
    295     ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
    296         unknown_fields(), output);
    297   }
    298   // @@protoc_insertion_point(serialize_end:lm.helloworld)
    299 }
    300 
    301 ::google::protobuf::uint8* helloworld::SerializeWithCachedSizesToArray(
    302     ::google::protobuf::uint8* target) const {
    303   // @@protoc_insertion_point(serialize_to_array_start:lm.helloworld)
    304   // required int32 id = 1;
    305   if (has_id()) {
    306     target = ::google::protobuf::internal::WireFormatLite::WriteInt32ToArray(1, this->id(), target);
    307   }
    308 
    309   // required string str = 2;
    310   if (has_str()) {
    311     ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
    312       this->str().data(), this->str().length(),
    313       ::google::protobuf::internal::WireFormat::SERIALIZE,
    314       "str");
    315     target =
    316       ::google::protobuf::internal::WireFormatLite::WriteStringToArray(
    317         2, this->str(), target);
    318   }
    319 
    320   // optional int32 opt = 3;
    321   if (has_opt()) {
    322     target = ::google::protobuf::internal::WireFormatLite::WriteInt32ToArray(3, this->opt(), target);
    323   }
    324 
    325   if (!unknown_fields().empty()) {
    326     target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
    327         unknown_fields(), target);
    328   }
    329   // @@protoc_insertion_point(serialize_to_array_end:lm.helloworld)
    330   return target;
    331 }
    332 
    333 int helloworld::ByteSize() const {
    334   int total_size = 0;
    335 
    336   if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) {
    337     // required int32 id = 1;
    338     if (has_id()) {
    339       total_size += 1 +
    340         ::google::protobuf::internal::WireFormatLite::Int32Size(
    341           this->id());
    342     }
    343 
    344     // required string str = 2;
    345     if (has_str()) {
    346       total_size += 1 +
    347         ::google::protobuf::internal::WireFormatLite::StringSize(
    348           this->str());
    349     }
    350 
    351     // optional int32 opt = 3;
    352     if (has_opt()) {
    353       total_size += 1 +
    354         ::google::protobuf::internal::WireFormatLite::Int32Size(
    355           this->opt());
    356     }
    357 
    358   }
    359   if (!unknown_fields().empty()) {
    360     total_size +=
    361       ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
    362         unknown_fields());
    363   }
    364   GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
    365   _cached_size_ = total_size;
    366   GOOGLE_SAFE_CONCURRENT_WRITES_END();
    367   return total_size;
    368 }
    369 
    370 void helloworld::MergeFrom(const ::google::protobuf::Message& from) {
    371   GOOGLE_CHECK_NE(&from, this);
    372   const helloworld* source =
    373     ::google::protobuf::internal::dynamic_cast_if_available<const helloworld*>(
    374       &from);
    375   if (source == NULL) {
    376     ::google::protobuf::internal::ReflectionOps::Merge(from, this);
    377   } else {
    378     MergeFrom(*source);
    379   }
    380 }
    381 
    382 void helloworld::MergeFrom(const helloworld& from) {
    383   GOOGLE_CHECK_NE(&from, this);
    384   if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) {
    385     if (from.has_id()) {
    386       set_id(from.id());
    387     }
    388     if (from.has_str()) {
    389       set_str(from.str());
    390     }
    391     if (from.has_opt()) {
    392       set_opt(from.opt());
    393     }
    394   }
    395   mutable_unknown_fields()->MergeFrom(from.unknown_fields());
    396 }
    397 
    398 void helloworld::CopyFrom(const ::google::protobuf::Message& from) {
    399   if (&from == this) return;
    400   Clear();
    401   MergeFrom(from);
    402 }
    403 
    404 void helloworld::CopyFrom(const helloworld& from) {
    405   if (&from == this) return;
    406   Clear();
    407   MergeFrom(from);
    408 }
    409 
    410 bool helloworld::IsInitialized() const {
    411   if ((_has_bits_[0] & 0x00000003) != 0x00000003) return false;
    412 
    413   return true;
    414 }
    415 
    416 void helloworld::Swap(helloworld* other) {
    417   if (other != this) {
    418     std::swap(id_, other->id_);
    419     std::swap(str_, other->str_);
    420     std::swap(opt_, other->opt_);
    421     std::swap(_has_bits_[0], other->_has_bits_[0]);
    422     _unknown_fields_.Swap(&other->_unknown_fields_);
    423     std::swap(_cached_size_, other->_cached_size_);
    424   }
    425 }
    426 
    427 ::google::protobuf::Metadata helloworld::GetMetadata() const {
    428   protobuf_AssignDescriptorsOnce();
    429   ::google::protobuf::Metadata metadata;
    430   metadata.descriptor = helloworld_descriptor_;
    431   metadata.reflection = helloworld_reflection_;
    432   return metadata;
    433 }
    434 
    435 
    436 // @@protoc_insertion_point(namespace_scope)
    437 
    438 }  // namespace lm
    439 
    440 // @@protoc_insertion_point(global_scope)
    lm.helloworld.pb.cc
      1 // Abstract interface for protocol messages.
      2 //
      3 // See also MessageLite, which contains most every-day operations.  Message
      4 // adds descriptors and reflection on top of that.
      5 //
      6 // The methods of this class that are virtual but not pure-virtual have
      7 // default implementations based on reflection.  Message classes which are
      8 // optimized for speed will want to override these with faster implementations,
      9 // but classes optimized for code size may be happy with keeping them.  See
     10 // the optimize_for option in descriptor.proto.
     11 class LIBPROTOBUF_EXPORT Message : public MessageLite {
     12  public:
     13   inline Message() {}
     14   virtual ~Message();
     15  
     16   // Basic Operations ------------------------------------------------
     17  
     18   // Construct a new instance of the same type.  Ownership is passed to the
     19   // caller.  (This is also defined in MessageLite, but is defined again here
     20   // for return-type covariance.)
     21   virtual Message* New() const = 0;
     22  
     23   // Make this message into a copy of the given message.  The given message
     24   // must have the same descriptor, but need not necessarily be the same class.
     25   // By default this is just implemented as "Clear(); MergeFrom(from);".
     26   virtual void CopyFrom(const Message& from);
     27  
     28   // Merge the fields from the given message into this message.  Singular
     29   // fields will be overwritten, except for embedded messages which will
     30   // be merged.  Repeated fields will be concatenated.  The given message
     31   // must be of the same type as this message (i.e. the exact same class).
     32   virtual void MergeFrom(const Message& from);
     33  
     34   // Verifies that IsInitialized() returns true.  GOOGLE_CHECK-fails otherwise, with
     35   // a nice error message.
     36   void CheckInitialized() const;
     37  
     38   // Slowly build a list of all required fields that are not set.
     39   // This is much, much slower than IsInitialized() as it is implemented
     40   // purely via reflection.  Generally, you should not call this unless you
     41   // have already determined that an error exists by calling IsInitialized().
     42   void FindInitializationErrors(vector<string>* errors) const;
     43  
     44   // Like FindInitializationErrors, but joins all the strings, delimited by
     45   // commas, and returns them.
     46   string InitializationErrorString() const;
     47  
     48   // Clears all unknown fields from this message and all embedded messages.
     49   // Normally, if unknown tag numbers are encountered when parsing a message,
     50   // the tag and value are stored in the message's UnknownFieldSet and
     51   // then written back out when the message is serialized.  This allows servers
     52   // which simply route messages to other servers to pass through messages
     53   // that have new field definitions which they don't yet know about.  However,
     54   // this behavior can have security implications.  To avoid it, call this
     55   // method after parsing.
     56   //
     57   // See Reflection::GetUnknownFields() for more on unknown fields.
     58   virtual void DiscardUnknownFields();
     59  
     60   // Computes (an estimate of) the total number of bytes currently used for
     61   // storing the message in memory.  The default implementation calls the
     62   // Reflection object's SpaceUsed() method.
     63   virtual int SpaceUsed() const;
     64  
     65   // Debugging & Testing----------------------------------------------
     66  
     67   // Generates a human readable form of this message, useful for debugging
     68   // and other purposes.
     69   string DebugString() const;
     70   // Like DebugString(), but with less whitespace.
     71   string ShortDebugString() const;
     72   // Like DebugString(), but do not escape UTF-8 byte sequences.
     73   string Utf8DebugString() const;
     74   // Convenience function useful in GDB.  Prints DebugString() to stdout.
     75   void PrintDebugString() const;
     76  
     77   // Heavy I/O -------------------------------------------------------
     78   // Additional parsing and serialization methods not implemented by
     79   // MessageLite because they are not supported by the lite library.
     80  
     81   // Parse a protocol buffer from a file descriptor.  If successful, the entire
     82   // input will be consumed.
     83   bool ParseFromFileDescriptor(int file_descriptor);
     84   // Like ParseFromFileDescriptor(), but accepts messages that are missing
     85   // required fields.
     86   bool ParsePartialFromFileDescriptor(int file_descriptor);
     87   // Parse a protocol buffer from a C++ istream.  If successful, the entire
     88   // input will be consumed.
     89   bool ParseFromIstream(istream* input);
     90   // Like ParseFromIstream(), but accepts messages that are missing
     91   // required fields.
     92   bool ParsePartialFromIstream(istream* input);
     93  
     94   // Serialize the message and write it to the given file descriptor.  All
     95   // required fields must be set.
     96   bool SerializeToFileDescriptor(int file_descriptor) const;
     97   // Like SerializeToFileDescriptor(), but allows missing required fields.
     98   bool SerializePartialToFileDescriptor(int file_descriptor) const;
     99   // Serialize the message and write it to the given C++ ostream.  All
    100   // required fields must be set.
    101   bool SerializeToOstream(ostream* output) const;
    102   // Like SerializeToOstream(), but allows missing required fields.
    103   bool SerializePartialToOstream(ostream* output) const;
    104  
    105  
    106   // Reflection-based methods ----------------------------------------
    107   // These methods are pure-virtual in MessageLite, but Message provides
    108   // reflection-based default implementations.
    109  
    110   virtual string GetTypeName() const;
    111   virtual void Clear();
    112   virtual bool IsInitialized() const;
    113   virtual void CheckTypeAndMergeFrom(const MessageLite& other);
    114   virtual bool MergePartialFromCodedStream(io::CodedInputStream* input);
    115   virtual int ByteSize() const;
    116   virtual void SerializeWithCachedSizes(io::CodedOutputStream* output) const;
    117  
    118  private:
    119   // This is called only by the default implementation of ByteSize(), to
    120   // update the cached size.  If you override ByteSize(), you do not need
    121   // to override this.  If you do not override ByteSize(), you MUST override
    122   // this; the default implementation will crash.
    123   //
    124   // The method is private because subclasses should never call it; only
    125   // override it.  Yes, C++ lets you do that.  Crazy, huh?
    126   virtual void SetCachedSize(int size) const;
    127  
    128  public:
    129  
    130   // Introspection ---------------------------------------------------
    131  
    132   // Typedef for backwards-compatibility.
    133   typedef google::protobuf::Reflection Reflection;
    134  
    135   // Get a Descriptor for this message's type.  This describes what
    136   // fields the message contains, the types of those fields, etc.
    137   const Descriptor* GetDescriptor() const { return GetMetadata().descriptor; }
    138  
    139   // Get the Reflection interface for this Message, which can be used to
    140   // read and modify the fields of the Message dynamically (in other words,
    141   // without knowing the message type at compile time).  This object remains
    142   // property of the Message.
    143   //
    144   // This method remains virtual in case a subclass does not implement
    145   // reflection and wants to override the default behavior.
    146   virtual const Reflection* GetReflection() const {
    147     return GetMetadata().reflection;
    148   }
    149  
    150  protected:
    151   // Get a struct containing the metadata for the Message. Most subclasses only
    152   // need to implement this method, rather than the GetDescriptor() and
    153   // GetReflection() wrappers.
    154   virtual Metadata GetMetadata() const  = 0;
    155  
    156  
    157  private:
    158   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Message);
    159 };
    Message.h
    
    
    3. 在需求代码中引入2中的实现
    使用:

    Docker与Dockerfile极简入门文档

    https://blog.csdn.net/qq_33256688/article/details/80319673
  • 相关阅读:
    Hbase记录-Hbase shell使用
    Hbase记录-Hbase基础概念
    JAVA记录-SpringMVC集成redis
    JAVA记录-redis缓存机制介绍(四)
    JAVA记录-redis缓存机制介绍(三)
    JAVA记录-redis缓存机制介绍(二)
    JAVA记录-redis缓存机制介绍(一)
    JAVA记录-SpringMVC scope属性的两种模式
    JAVA记录-JDBC介绍
    鼠标拖动,改变列表宽度
  • 原文地址:https://www.cnblogs.com/cjyp/p/10292304.html
Copyright © 2020-2023  润新知