处理Telegram.org API模式中未定义的类型,如;MessageMedia“;
在telegram.org api模式中,处理Telegram.org API模式中未定义的类型,如;MessageMedia“;,api,telegram,Api,Telegram,在telegram.org api模式中,消息类型定义如下: 消息#c09be45f flags:#out:flags.1?真提到:flags.4?真媒体_未读:flags.5?真静默:flags.13?真帖子:flags.14?真id:int from_id:flags.8?int to_id:Peer fwd_from:flags.2?MessageFwdHeader通过_bot_id:flags.11?int回复_msg_id:flags.3?int日期:int消息:string媒体:fl
消息
类型定义如下:
消息#c09be45f flags:#out:flags.1?真提到:flags.4?真媒体_未读:flags.5?真静默:flags.13?真帖子:flags.14?真id:int from_id:flags.8?int to_id:Peer fwd_from:flags.2?MessageFwdHeader通过_bot_id:flags.11?int回复_msg_id:flags.3?int日期:int消息:string媒体:flags.9?MessageMedia回复_标记:flags.6?ReplyMarkup实体:标志。7?矢量视图:标志。10?整数编辑日期:标志。15?整数=消息
注意可选参数media:flags.9?MessageMedia
被定义为类型MessageMedia
。但是没有任何地方定义了MessageMedia
,因此我的客户机不知道如何序列化/反序列化它
什么类型是
MessageMedia
,我如何处理可能未定义的其他类型?理解这一点的最佳方式是media:flags.9?MessageMedia
表示一般类型,或者如他们所说的基本类型,可以是以下任何类型:
messageMediaEmpty#3ded6320 = MessageMedia;
messageMediaPhoto#3d8ce53d photo:Photo caption:string = MessageMedia;
messageMediaGeo#56e0d474 geo:GeoPoint = MessageMedia;
messageMediaContact#5e7d2f39 phone_number:string first_name:string last_name:string user_id:int = MessageMedia;
messageMediaUnsupported#9f84f49e = MessageMedia;
messageMediaDocument#f3e02ea8 document:Document caption:string = MessageMedia;
messageMediaWebPage#a32dd600 webpage:WebPage = MessageMedia;
messageMediaVenue#7912b71f geo:GeoPoint title:string address:string provider:string venue_id:string = MessageMedia;
这种模式在电报API中很常见理解这一点的最佳方式是媒体:flags.9?MessageMedia
表示一般类型,或者如他们所说的基本类型,可以是以下任何类型:
messageMediaEmpty#3ded6320 = MessageMedia;
messageMediaPhoto#3d8ce53d photo:Photo caption:string = MessageMedia;
messageMediaGeo#56e0d474 geo:GeoPoint = MessageMedia;
messageMediaContact#5e7d2f39 phone_number:string first_name:string last_name:string user_id:int = MessageMedia;
messageMediaUnsupported#9f84f49e = MessageMedia;
messageMediaDocument#f3e02ea8 document:Document caption:string = MessageMedia;
messageMediaWebPage#a32dd600 webpage:WebPage = MessageMedia;
messageMediaVenue#7912b71f geo:GeoPoint title:string address:string provider:string venue_id:string = MessageMedia;
这种模式在电报API中很常见,但即使是基类型最终也必须解析为已知类型(Int、Long、String等),这样它们才能被序列化/反序列化,对吗?在我的例子中,我目前正在进行反序列化,稍后我将担心序列化。如果MessageMedia
可以是上述任何一种类型,我如何知道要反序列化的类型?@KennyCason反序列化是我在为MessageMedia
之类的字段读取描述符时的意思,您将找不到MessageMedia
,相反,它将是一个MessageMedia
variants如何知道是哪一个?是服务器返回的id号吗?@KennyCason您正在按照接收的顺序解码电报中的字节流,并且它总是按照给定类型的预期字段顺序进行编码。这一点非常好。只要将返回的字符串转换为io.BytesIO,您就可以一次解压一个元素,前提是您知道预期的数据类型(int、string等),并且这是协议中已知的。但即使是基类型最终也必须解析为已知的类型(int、Long、string等),以便可以对它们进行序列化/反序列化,对吗?在我的例子中,我目前正在进行反序列化,稍后我将担心序列化。如果MessageMedia
可以是上述任何一种类型,我如何知道要反序列化的类型?@KennyCason反序列化是我在为MessageMedia
之类的字段读取描述符时的意思,您将找不到MessageMedia
,相反,它将是一个MessageMedia
variants如何知道是哪一个?是服务器返回的id号吗?@KennyCason您正在按照接收的顺序解码电报中的字节流,并且它总是按照给定类型的预期字段顺序进行编码。这一点非常好。只要将返回的字符串转换为io.BytesIO,您就可以一次解包一个元素,前提是您知道预期的数据类型(int、string等),并且这是协议中已知的。