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)
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}")
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])
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)))