コード例 #1
0
  def GetMessage2(self, name, total_size):

    try:
      if name == 'ctp.mq.BasicMQ':
        msg = pb.mq_protomsg_pb2.BasicMQ()
        msg.ParseFromString(self.data[8 + len(name):total_size + 4])
        return msg
      elif name == 'ctp.mq.LevelMQ':
        msg = pb.mq_protomsg_pb2.LevelMQ()
        msg.ParseFromString(self.data[8 + len(name):total_size + 4])
        return msg
      elif name == 'ctp.cp.BacktestingResultSave2DBRequery':
        #嵌套自定义报错,原因不明
        msg = pb.cp_comunication_pb2.BacktestingResultSave2DBRequery()
        msg.ParseFromString(self.data[8 + len(name):total_size + 4])
        return msg
      else:
        ds = self.pool.FindMessageTypeByName(name)
        if ds:

          #这个地方就是有问题的。你通过name拿到的只是外面那个message的des。如果里面嵌套message,
          #确实不知道ds是什么啊。。。
          #或者说,最外层的des,有携带内层des的义务吗??
          return reflection.ParseMessage(ds, self.data[8 + len(name):total_size + 4])
        else:
          print('FindMessageTypeByName no find the data : ', name)
        return None
    except Exception as inst:
      exstr = traceback.format_exc()
      print ('exception stack',exstr)
      print(inst)
コード例 #2
0
    def next(self, default=None):
        while True:
            vtype, data = self._read_next_obj()
            if vtype is None:
                if default is None:
                    raise StopIteration
                return default

            if vtype == T_DESCRIPTOR_NAME:
                self._next_descr_name = data.decode("utf8")
                self._next_descr = self._dpool.FindMessageTypeByName(
                    self._next_descr_name)

            elif vtype == T_MESSAGE:
                if self.return_raw_object:
                    return self._next_descr_name, self._next_descr, data
                else:
                    return reflection.ParseMessage(self._next_descr, data)

            else:
                raise Exception(f"Unknown message type {vtype}")
コード例 #3
0
  def GetMessage(self, name, total_size):

    ds = self.pool.FindMessageTypeByName(name)
    if ds:
      return reflection.ParseMessage(ds, self.data[8 + len(name):total_size + 4])
コード例 #4
0
def Test():
  #t1 = pb.cp_comunication_pb2.test1()
  #t1.s = 'hello'

  command = pb.cp_comunication_pb2.Command()
  command.cmd = 'hello'
  command.params.append('world')
  command_out = command.SerializeToString()


  #
  t2 = pb.cp_comunication_pb2.test2()
  t2.s2 = 'world'
  t2.t2.s = 'hello'

  codec = ProtobufCodec()
  out = codec.PackMessage(t2)
  out2 = t2.SerializeToString()
  #=======================================
  #pool = descriptor_pool.DescriptorPool()
  #id = descriptor_pb2.FileDescriptorProto.FromString(
  #    pb.cp_comunication_pb2.DESCRIPTOR.serialized_pb)
  #pool.Add(id)

  id = descriptor_pb2.FileDescriptorProto.FromString(
      pb.cp_comunication_pb2.DESCRIPTOR.serialized_pb)
  

  db = descriptor_database.DescriptorDatabase()
  pool = descriptor_pool.DescriptorPool(db)
  db.Add(id)
  #db.Add(self.factory_test2_fd)
  #=================
  ##id = descriptor_pb2.FileDescriptorProto.FromString(
  #    pb.cc_comunication_pb2.DESCRIPTOR.serialized_pb)
  #pool.Add(id)
  #======================
  
  #======================
  #id = descriptor_pb2.FileDescriptorProto.FromString(
  #    pb.mq_protomsg_pb2.DESCRIPTOR.serialized_pb)
  #pool.Add(id)
  #======================
  #id = descriptor_pb2.FileDescriptorProto.FromString(
  #    pb.guard_comunication_pb2.DESCRIPTOR.serialized_pb)
  #pool.Add(id)


  #========================================================================
  d1 = pb.cp_comunication_pb2.test2.DESCRIPTOR
  #dp1 = DescriptorProto()
  #d1.CopyToProto(dp1)
  # dp1 serialized, sent over network, deserialized
  #d2 = descriptor.MakeDescriptor(dp1)
  ## Un-commenting this block fixes the problem
  #
  #for desc in dp1.nested_type:
  #    d2.nested_types.append( descriptor.MakeDescriptor(desc) )
  #d2.nested_types_by_name = dict((t.name, t) for t in d2.nested_types)
  #    
  #for f in dp1.field:
  #    d2.fields_by_number[f.number].message_type = d2.nested_types_by_name[f.type_name.split('.')[-1]]
  #
  # This cannot be duplicated across the net
  #d2.fields[0].message_type._concrete_class = d1.fields[0].message_type._concrete_class 
  #=======================================

  ds_command = pool.FindMessageTypeByName('ctp.cp.Command')
  print(str(reflection.ParseMessage(ds_command, command_out)))
  #========================================
  temp = pb.cp_comunication_pb2.test2()
  temp.ParseFromString(out2)
  print('temp :', str(temp))
  ds = pool.FindMessageTypeByName('ctp.cp.test2')
  #ds = pool.FindMessageTypeByName('pb.cp_comunication_pb2.ctp.cp.test2')
  print (isinstance(ds, descriptor.Descriptor))
  if ds:
    print('find ds', str(ds))
    print('find ds', str(d1))
    print(str(reflection.ParseMessage(d1, out2)))
    print(str(reflection.ParseMessage(ds, out2)))