code: def dict2pb(cls, adict, strict=False):
      
      obj = cls()
      for field in obj.DESCRIPTOR.fields:
          if not field.label == field.LABEL_REQUIRED:
              continue
          if not field.has_default_value:
              continue
          if not field.name in adict:
              raise ConvertException('Field "%s" missing from descriptor dictionary.'
                                     % field.name)
      field_names = set([field.name for field in obj.DESCRIPTOR.fields])
      if strict:
          for key in adict.keys():
              if key not in field_names:
                  raise ConvertException(
                      'Key "%s" can not be mapped to field in %s class.'
                      % (key, type(obj)))
      for field in obj.DESCRIPTOR.fields:
          if not field.name in adict:
              continue
          msg_type = field.message_type
          if field.label == FD.LABEL_REPEATED:
              if field.type == FD.TYPE_MESSAGE:
                  for sub_dict in adict[field.name]:
                      item = getattr(obj, field.name).add()
                      item.CopyFrom(dict2pb(msg_type._concrete_class, sub_dict))
              else:
                  # fix python3 map用法变更
                  list(map(getattr(obj, field.name).append, adict[field.name]))
          else:
              if field.type == FD.TYPE_MESSAGE:
                  value = dict2pb(msg_type._concrete_class, adict[field.name])
                  getattr(obj, field.name).CopyFrom(value)
              elif field.type in [FD.TYPE_UINT64, FD.TYPE_INT64, FD.TYPE_SINT64]:
                  setattr(obj, field.name, int(adict[field.name]))
              else:
                  setattr(obj, field.name, adict[field.name])
      return obj
docs: Takes a class representing the ProtoBuf Message and fills it with data from
      the dict.