CN116820428A - 一种反序列化代码生成方法及装置 - Google Patents
一种反序列化代码生成方法及装置 Download PDFInfo
- Publication number
- CN116820428A CN116820428A CN202310845505.7A CN202310845505A CN116820428A CN 116820428 A CN116820428 A CN 116820428A CN 202310845505 A CN202310845505 A CN 202310845505A CN 116820428 A CN116820428 A CN 116820428A
- Authority
- CN
- China
- Prior art keywords
- code
- type
- dependent
- statement
- objects
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
- 238000000034 method Methods 0.000 title claims abstract description 55
- 230000001419 dependent effect Effects 0.000 claims abstract description 76
- 238000004458 analytical method Methods 0.000 claims abstract description 45
- 238000012163 sequencing technique Methods 0.000 claims abstract description 9
- 230000006870 function Effects 0.000 claims description 90
- 230000008676 import Effects 0.000 claims description 11
- 238000005034 decoration Methods 0.000 claims description 8
- 238000012545 processing Methods 0.000 claims description 3
- 238000011161 development Methods 0.000 abstract description 5
- 238000010606 normalization Methods 0.000 abstract description 2
- 238000005516 engineering process Methods 0.000 description 3
- 238000010586 diagram Methods 0.000 description 2
- 235000021110 pickles Nutrition 0.000 description 2
- 240000000662 Anethum graveolens Species 0.000 description 1
- 238000013459 approach Methods 0.000 description 1
- 230000005540 biological transmission Effects 0.000 description 1
- 238000007405 data analysis Methods 0.000 description 1
- 238000000605 extraction Methods 0.000 description 1
- 230000014759 maintenance of location Effects 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 230000002688 persistence Effects 0.000 description 1
- 230000010076 replication Effects 0.000 description 1
Landscapes
- Stored Programmes (AREA)
Abstract
本发明公开了一种反序列化代码生成方法及装置,适用于Python语言。具体方案为:获取被序列化对象,抽取其上下文信息;根据上下文信息对被序列化对象进行依赖分析,获取所有依赖对象和依赖关系;分析所述依赖对象的对象类型和所属模块,生成创建对应对象的代码语句;将所述代码语句根据所述依赖关系排序,生成反序列化代码。通过本发明的技术方案,可基于被序列化对象生成反序列化代码,减少人工编写反序列化代码的工作量,有效提升代码开发效率,并大大减少代码出现问题的可能性,且确保了代码的规范性以及正确性。
Description
技术领域
本发明涉及一种反序列化代码生成方法及装置,具体一种Python对象反序列化代码生成方法和装置,属于软件技术领域。
背景技术
在编程语言中,通常通过将运行时对象序列化为二进制字节流来实现对象持久化或对象传输。二进制字节流一般是一系列字节码指令,用于恢复对象在编程语言解释器的状态。在Python编程语言中,序列化技术可以分为两类:基于引用的序列化和基于值的序列化。其中基于引用的序列化是指仅序列化对象本身的数据和其依赖的外部变量的引用,基于值的序列化是指递归地序列化依赖的外部变量的值。
基于引用的序列化的典型库为Pickle,这种技术通过分析被序列化对象的运行时状态,生成创建相同对象的字节码指令,并保存为字节流(上述字节码指令的生成方式由不同的序列化协议确定);在反序列化时,解析字节流,并执行创建被序列化对象的字节码指令,并恢复被序列化对象。这种方法可以正确还原被序列化对象,但无法还原对象依赖的其他对象,其原因在于对象内部包含对外部变量的引用,这部分变量指向其他运行时对象,而上述技术仅序列化指向这些对象的引用,并不序列化上述对象。用户需要添加复杂的反序列化代码来创建上述依赖对象,这个过程容易产生错误,例如代码和数据的不一致,代码编写过程的异常和错误等,且带来了额外的开发成本。
基于值的序列化的库Dill和CloudPickle基于Pickle的序列化框架进行扩展,上述技术可以递归地序列化对象的引用指向的依赖对象,包括函数和类对象。但上述框架只能通过运行时分析获取编译后的函数和类对象字节码。在可理解性敏感的场景,如版本控制和实验复现,保留函数和类对象的字节码缺乏可理解性,可能需要人工绑定序列化代码来维护一致性。同时,在理解被序列化对象时需要分析其与序列化代码的关联关系,这个过程复杂且易出错。
现有技术中至少存在如下问题:对于基于引用的序列化技术,用户采用人工编写反序列化代码,这种方法工作量大,且容易出错;对于基于值的序列化技术,只适用于分布式对象传输等不要求程序可理解性的场景,在版本控制、实验复现和迭代开发等场景下,基于值的序列化技术无法提供需要的可理解性,用户需要人工绑定序列化代码和被序列化对象以维持一致,并需要理解被序列化对象和序列化代码之间的关联关系,因此这种方法同样复杂易错,增加额外开发成本。
发明内容
发明目的:针对现有技术中存在的问题与不足,本发明提供一种反序列化代码生成方法及装置。本发明的技术方案可基于被序列化对象生成反序列化代码,减少人工编写反序列化代码的工作量,有效提升代码开发效率,并大大减少代码出现问题的可能性,且确保了代码的规范性以及正确性。
技术方案:一种反序列化代码生成方法,适用于Python语言,包括:
1)获取被序列化对象,抽取被序列化对象的上下文信息;
2)根据上下文信息对被序列化对象进行依赖分析,获取所有依赖对象和依赖关系;
3)分析所述依赖对象的对象类型和所属模块,生成创建对应对象的代码语句;
4)将所述代码语句根据所述依赖关系排序,生成反序列化代码。
所述方法以函数接口形式在序列化程序源代码中被调用,被序列化对象以参数形式被传入所述函数接口,且函数接口被预先导入序列化程序源代码。
所述1)中获取被序列化对象,抽取被序列化对象的上下文信息,具体包括:
11)通过动态代码检查库获取函数接口调用栈帧;
12)加载栈帧的上下文信息到内存,所述上下文信息包括:局部变量、嵌套变量、全局变量和内建变量。
所述2)中对被序列化对象进行依赖分析,获取所有依赖对象和依赖关系,具体包括:
21)抽取被分析对象类型,将对象分类为值类型、类类型、函数类型、闭包类型、类实例类型、装饰器类型和容器类型;
22)根据21)所述对象类型处理被分析对象,分析对象存在的依赖关系,所述依赖关系包括嵌套变量引用关系、全局变量引用关系、实例关系、成员关系、闭包关系、装饰关系和包含关系;最后,记录与被分析对象存在上述关系的所有依赖对象;
23)对22)所述依赖对象重复21)~22)步骤,直到被分析对象不存在上述依赖关系。
所述22)的依赖关系和依赖对象分析,具体包括:
221)对于值类型对象,不包含任何依赖关系,不存在依赖对象;
222)对于类实例对象,与其类类型对象存在实例关系的,依赖于该对象;同时,类实例对象的属性或状态关联其他成员对象,存在成员关系,依赖于其成员对象;
223)对于类类型对象,其类定义语句中可能包含对外部变量的引用,从而存在全局变量引用关系,依赖于所述外部变量指向的对象;同时,类定义语句前可能包含装饰器语句,从而存在装饰关系,依赖于对应装饰器对象;
224)对于函数类型对象,其函数定义语句中可能包含对外部变量的引用,从而存在全局变量引用关系,依赖于所述引用的外部变量指向的对象;
225)对于闭包类型对象,其函数定义语句中可能包含对外部变量的引用,从而存在全局变量引用关系,依赖于所述引用的外部变量指向的对象;同时,闭包类型对象的栈帧由外部函数定义,存在闭包关系,闭包类型对象依赖于定义其栈帧的函数对象;同时,闭包类型对象的栈帧中包含外部函数的局部变量引用,从而存在局部变量引用关系,依赖于所述闭包类型栈帧中引用的外部函数局部变量指向的对象;
226)对于装饰器类型对象,其本质为特殊的闭包类型对象,需要进行225)步骤的依赖关系和依赖对象分析;同时,装饰器类型对象的closure或globals中包含对函数的引用,构成对上述closure或globals引用的函数对象的装饰关系,依赖于上述closure或globals引用的函数对象;
227)对于容器类型对象,其本质为特殊的类实例对象,需要进行223)步骤的依赖关系和依赖对象分析;同时,容器类型对象可以迭代遍历内部对象,从而存在对内部对象对包含关系,依赖于上述容器类型对象的内部对象。
所述3) 分析所述依赖对象的对象类型和所属模块,生成创建对应对象的代码语句,具体包括:
31)根据依赖关系遍历所有依赖对象进行分析;
32)抽取被分析对象的对象类型和所属模块;
33)根据被分析对象的对象类型和所属模块生成代码语句。
所述31)中,遍历依赖对象和依赖关系由前述22)步骤记录;
所述32)中,被分析对象的类型抽取与21)所述方法相同;被分析对象的所属模块分类,包括主模块、内置模块和导入模块。
主模块,模块加载文件为Python程序的入口文件;
内置模块,模块无需加载,由Python解释器自动加载;
导入模块,模块在主模块中被导入。
所述33)中,创建被分析对象的代码语句生成,其语句包括:类定义语句、函数定义语句、函数调用语句、装饰器语句和模块导入语句,其策略为:
331)对于值类型对象,生成赋值语句作为创建对应对象的代码语句,赋值语句左值为值类型对象的变量名,右值为值类型对象具体值;
332)对于类实例对象,首先序列化该对象,然后生成类实例对象的赋值语句,赋值语句左值为该对象的变量名,右值为反序列化函数调用语句,最后在前述反序列化函数调用语句中回填被分析对象序列化文件存储地址作为参数;
333)对于类类型对象,对于主模块类,正则匹配主模块类的源文件的类定义语句作为创建对应对象的代码语句;对于内置模块类,不生成代码语句;对于导入模块类,生成导入导入模块类的模块导入语句;
334)对于函数类型对象,对于主模块函数,正则匹配模块函数的源文件的函数定义语句作为创建对应对象的代码语句;对于内置模块函数,不生成代码语句;对于导入模块函数,生成导入该函数的模块导入语句;
335)对于闭包类型对象,首先通过其qualname(路径名称)获取其栈帧的生成函数名,然后对生成函数执行334)步骤,最后生成赋值语句作为创建对应对象的代码语句,赋值语句左值为对象变量名,右值为函数初始化的函数调用语句,函数调用语句参数为当前闭包对象的globals、name、closure和code对象;
336)对于装饰器类型对象,其本质同样是函数对象,创建对应对象的代码语句生成过程与函数类型对象一致,其具体步骤与334)相同;
337)对于容器类型对象,其本质是容器类的类实例对象,创建对应对象的代码语句生成过程与类实例对象一致,其具体步骤与332)相同。
所述331)~337)步骤生成的代码语句之间存在依赖关系,所述依赖关系的指向与被分析对象一致。
类定义语句,符合Python类定义语法的ClassDef语句;
函数定义语句,符合Python函数定义语法的FuncDef语句;
函数调用语句,符合Python函数定义语法的Call语句;
装饰器语句,符合Python装饰器语法的Decorator语句;
模块导入语句,符合Python模块导入语法的Import/ImportFrom语句;
赋值语句,符合Python赋值语法的Assign语句。
所述4)对代码语句排序,生成反序列化代码,包括按照所述依赖关系对3)生成的代码语句进行排序,并拼接为字符串,并返回该字符串。所述排序方式为,依赖关系的遍历顺序逆序。
一种Python对象的反序列化代码生成装置,包括:
配置单元,用于确定序列化对象的存储目录;
上下文分析单元,用于在函数接口接收被序列化对象时获取该收被序列化对象的上下文信息;
依赖分析单元,用于解析被分析对象的对象类型、依赖关系和依赖对象;
依赖对象总线,用于存储和传输上述依赖对象;
序列化单元,用于对被序列化对象进行序列化,并存储至所述存储目录;
语句生成单元,用于解析被分析对象的对象类型和所属模块,生成创建对应对象的代码语句;
语句总线,用于存储和传输上述代码语句;
代码生成单元,用于对前述代码语句进行排序,生成最终反序列化代码字符串并输出。
所述上下文分析单元,其具体功能包括:接收函数接口调用传入的被序列化对象,然后执行反序列化代码生成方法的步骤1),最后输出被序列化对象和上下文信息;
所述依赖分析单元,其具体功能包括:接收上下文分析单元传入的被序列化对象和上下文信息,然后执行反序列化代码生成方法的步骤2),最后将上述步骤的所有依赖对象和依赖关系记录到依赖对象总线。
所述语句生成单元,在依赖分析单元任务结束后,从依赖对象总线读入依赖分析单元输出的依赖对象和依赖关系,然后执行反序列化代码生成方法的步骤3),最后将生成的代码语句记录到语句总线。
所述语句生成单元,在代码语句生成过程中会调用序列化单元进行对象序列化,序列化单元读入配置单元的序列化对象存储目录配置,对对象进行序列化。具体地,根据对象序列化字节流生成MD5哈希地址,以上述哈希地址为序列化文件名创建文件并写入字节流,存储至所述配置单元的存储目录。
所述语句生成单元,其用途还包括:
生成代码语句时,使用序列化单元对对象数据进行序列化,并在代码语句中回填存储路径。
与现有技术方案相比,本发明具有以下特点:
1) 提供了反序列化代码生成方法,可以通过前述方法和装置生成反序列化代码,减少用户编写,理解相关代码的工作量。
2) 本发明具有通用性,提供了依赖对象分析和创建对应对象的代码语句生成方法,对被序列化对象进行细致分类,实现对主流工作场景下Python对象的支持。
3) 本发明具有正确性,代码语句由标准Python语法模板生成,并按依赖关系排序,避免用户人工编码可能导致的潜在错误。
4) 本发明具有可理解性,生成代码对用户提供了数据的相关类定义、函数定义和变量依赖关系参照,从而适用于数据分析和基于数据再开发等场景。
3) 本发明具有一致性,生成的反序列化程序和被序列化对象一一对应,避免用户人工绑定可能产生的不一致,从而适用于版本控制等场景。
附图说明
图1是本发明实施例的方法原理图;
图2是本发明实施例的装置流程图。
具体实施方式
下面结合具体实施例,进一步阐明本发明,应理解这些实施例仅用于说明本发明而不用于限制本发明的范围,在阅读了本发明之后,本领域技术人员对本发明的各种等价形式的修改均落于本申请所附权利要求所限定的范围。
图1是本发明实施例提供的一种Python对象的反序列化代码生成方法示意图,其至少包括如下步骤:
获取被序列化对象,抽取其上下文信息;
本发明实施例中,上下文信息是函数接口调用栈帧中变量信息的集合,包括局部变量、嵌套变量、全局变量和内建变量。上述栈帧(Frame)分析和变量分析可由已有动态检查库对当前函数调用帧进行解析生成。例如,假设被序列化对象在主模块中通过函数接口调用被本发明实施例的方法或装置处理,那么其函数接口调用栈帧为主模块中函数接口被调用时的变量作用域栈帧,上下文信息为此作用域内的变量集合。
根据上下文信息对被序列化对象进行依赖分析,获取所有依赖对象和依赖关系;
本发明实施例中,依赖对象被分类,包括:值类型、类类型、函数类型、闭包类型、类实例类型、装饰器类型和容器类型。
值类型,包括空值、布尔值、整数、长整数、浮点数、复数、字符串;
类类型,类型为type,并在被序列化对象的上下文信息可见;
函数类型,类型为function,并在被序列化对象的上下文信息可见;
闭包类型,在所述函数类型内部被定义;
类实例类型,类型为类类型;
装饰器类型,类型为function,并装饰所述函数类型或类类型;
容器类型,包含上述类型对象;
上述对象类别可由Python内置类型检查库对被分析对象的属性进行探查而判别,具体判别方法实施如下:
上述分类中,值类型可以直接通过内置方法isInstance判别。在某些实施例中,对象o经过isInstance(o, str)检查结果为True,则含义为o是字符串类型对象,从而o被分类为值类型。
上述分类中,闭包类型和装饰器类型都是特殊的函数类型对象,此三类对象的判别遵循优先级判断原则,其中装饰器类型优先级最高,函数类型优先级最低。具体地,在某些实施例中,被序列化对象o,经过isInstance(o, types.FunctionType)检查结果为True,则含义为对象o可能为函数类型对象;则进一步对o的code中的closure对象进行检查,若closure中不含有对象,那么确定为函数类型对象;否则此时o可能为闭包类型对象;则进一步对o的闭包对象类别进行检查,若类别不包含函数类型,那么确定为闭包类型对象;否则为装饰器类型对象。
上述分类中,容器类型是可迭代遍历内部对象的对象类型,因此特殊地,通过检查其迭代器字段进行判别。具体地,在某些实施例中,被序列化对象o,包含可迭代方法__iter__,则该对象可以通过索引迭代遍历内部对象,该对象被分类为容器类别。
上述分类中,所有类型都是某些类的实例,因此未被优先地分类为值类型、类类型、函数类型、闭包类型、装饰器类型或容器类型的对象,被分类为类实例类型。
分析所述依赖对象的对象类型和所属模块,生成创建对应对象的代码语句;
本发明实施例中,创建所述依赖对象的代码语句分类,包括:类定义语句、函数定义语句、函数调用语句、装饰器语句和模块导入语句。
上述语句通过模板生成,模板为Python的抽象语法树(Abstract Syntax Tree,ast)对应语句节点的语法模板;模板中待填写的值根据对象类别和所属模块确定。
上述所属模块的情况,包括:主模块、内置模块和导入模块。具体地,所属模块的判别可以通过动态检查库方法进行判别。具体地,在某些实施例中,对象o经由inspect.getModule(o)检查后返回主模块对象,则含义为对象o属于主模块。
上述通过模板生成语句的过程可由模板字符串完成。具体地,在某些实施例中,对象o为类实例类型对象,创建上述对象的代码语句生成过程为:首先序列化该对象,然后生成类实例对象的赋值语句模板字符串,模板字符串中存在两个变量,左值和右值;赋值语句左值为该对象的变量名;赋值右值为反序列化函数调用语句;进一步地,该函数调用语句由函数调用语法模板生成,模板字符串中存在两个变量,函数名和参数表,赋值函数名为实施例中的反序列化函数名,赋值参数表为函数序列化文件存储地址。
将代码语句根据依赖关系排序,生成反序列化代码。
依赖关系识别方法,包括:
嵌套变量引用关系,被分析对象内存在指向嵌套变量的引用,被分析对象对前述嵌套变量存在嵌套变量引用关系;
全局变量引用关系,被分析对象内存在指向全局变量的引用,被分析对象对前述全局变量存在全局变量引用关系;
实例关系,被分析对象是类类型对象的类实例类型对象,被分析对象对前述类类型对象存在实例关系;
成员关系,被分析对象是类实例类型对象,被分析对象的成员包含其他对象,被分析对象与前述对象存在成员关系;
闭包关系,被分析对象是函数类型对象的闭包类型对象,被分析对象对前述函数类型对象存在闭包关系;
装饰关系,被分析对象是类类型对象、函数类型对象或闭包类型对象,且被装饰器类型对象装饰,被分析对象对前述装饰器类型对象存在装饰关系;
包含关系,被分析对象是容器类型对象,且包含其他对象,被分析对象与其他对象存在包含关系。
依赖对象识别方法,包括,与被分析对象成立上述依赖关系的所有对象。
本发明实施例中,代码语句与其创建的对象一一对应,其依赖关系排序是对应对象依赖关系排序的逆序。具体地,在某些实施例中,类实例对象o1基于实例关系依赖于类类型对象o2,那么,o1和o2的依赖关系排序为[o1,o2]。对于创建o1对应的代码语句s1和创建o2对应的代码语句s2,其依赖关系排序为[s2,s1]。
上述排序中,依赖关系顺序的本质是偏序,具体地,全局的排序方法为拓扑排序。具体地,在某些实施例中,待排序语句s1,s2,s3,s4,存在如下依赖关系排序[s2,s1],[s4,s3],则最终拓扑排序可以为任意满足上述先后顺序的拓扑序,如[s2,s1,s4,s3]。
图2是本发明实施例提供的一种Python对象的反序列化装置流程示意图,其装置单元至少包括如下单元:
上下文分析单元
上下文分析单元,接收函数接口调用传入的被序列化对象,然后执行方法步骤101)的分析过程,最后输出被序列化对象和上下文信息。具体地,在本发明实施例中,被序列化对象通过函数接口传入上下文分析单元,经过上下文分析单元的处理生成上下文信息,最后输出被序列化对象和上下文信息。
依赖分析单元
依赖分析单元,接收上下文分析单元201)传入的被序列化对象和上下文信息,然后执行方法步骤102)的分析过程,最后输出依赖关系和依赖对象。具体地,在本发明实施例中,依赖分析单元,经过步骤102)的分析过程,解析被序列化对象的所有依赖关系和依赖对象;最后,前述内容被记录到依赖对象总线208),同时输出被序列化对象和上下文信息。
序列化单元
序列化单元,接收语句生成单元204)传入的对象和配置单元传入的序列化对象存储目录,然后对该对象进行序列化,并存储至前述存储路径,最后向语句生成单元返回序列化文件存储路径。具体地,在本发明实施例中,被传入的对象首先被序列化单元进行序列化,生成字节流对象;然后,字节流对象被序列化单元进行MD5加密,加密结果作为序列化文件名;最后,上述文件被存储到配置单元读入的存储目录,并返回序列化文件的绝对存储路径。
语句生成单元
所述语句生成单元,接收依赖分析单元202)输入的被序列化对象和上下文信息,并从依赖对象总线208)读入依赖对象,然后执行步骤103)的分析过程,最后输出创建被序列化对象和依赖对象的代码语句。具体地,在本发明实施例中,语句生成单元以被序列化对象为起始节点,通过依赖关系遍历所有依赖对象,并在遍历过程中生成创建上述对象的代码语句;在某些实施例中,生成的代码语句包含103)的反序列化函数调用,此时语句生成单元向203)序列化单元发起调用,向序列化单元传入对象,序列化单元返回上述对象的序列化文件存储路径,并回填到代码语句;最后,前述代码语句被记录到语句总线207),同时输出被序列化对象。
代码生成单元
代码生成单元,接收语句生成单元204)输入的被序列化对象,并从依赖对象总线208)读入依赖关系和依赖对象,并从语句总线207)读入代码语句;然后执行步骤103)的分析过程,最后输出生成代码。具体地,在本发明实施例中,代码生成单元以被序列化对象为起点,通过依赖关系遍历所有依赖对象,对遍历到的对象按照遍历顺序进行排序;然后代码生成单元将创建上述对象的代码语句按照对象排序的逆序排序;最后,将排序完的代码语句拼接为字符串输出。
配置单元
配置单元,用于读取用户预先设置的配置文件,配置文件内容包含被序列化对象的存储路径。在本发明实施例中,配置单元用于向序列化单元提供序列化对象的存储目录信息。
语句总线
语句总线,用于存储和传输创建对象的代码语句。在本发明实施例中,语句总线接收语句生成单元204)输出的代码语句,写入总线进行存储,在代码生成单元205)进行读取时输出代码语句。
依赖对象总线
依赖对象总线,用于存储和传输依赖对象和依赖关系。在本发明实施例中,被序列化对象的依赖对象和依赖关系被依赖分析单元202)输出,写入总线进行存储,在语句生成单元204)和代码生成单元205)进行读取时输出依赖关系和依赖对象。
显然,本领域的技术人员应该明白,上述的本发明实施例方法的各步骤和装置的各单元可以用通用的计算装置可执行的程序代码来实现,可选地,可以用通用的计算装置来实现,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案可以存储在存储装置中由计算装置来执行,并且在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤,或者将它们分别制作成各个集成电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。这样,本发明实施例不限制于任何特定的硬件和软件结合。
Claims (10)
1.一种反序列化代码生成方法,适用于Python语言,其特征在于,包括如下步骤:
1)获取被序列化对象,抽取被序列化对象的上下文信息;
2)根据上下文信息对被序列化对象进行依赖分析,获取所有依赖对象和依赖关系;
3)分析所述依赖对象的对象类型和所属模块,生成创建对应对象的代码语句;
4)将所述代码语句根据所述依赖关系排序,生成反序列化代码。
2.根据权利要求1所述的反序列化代码生成方法,其特征在于,所述反序列化代码生成方法以函数接口形式在序列化程序源代码中被调用,被序列化对象以参数形式被传入所述函数接口,所述函数接口被调用之前,所述函数接口预先被导入至所述序列化程序源代码中。
3.根据权利要求1所述的反序列化代码生成方法,其特征在于,抽取被序列化对象的上下文信息,所述上下文信息,包括:
所述被序列化对象以参数形式被传入所述函数接口时,所在的栈帧中的变量信息;
所述变量信息,包括:
局部变量、嵌套变量、全局变量和内建变量。
4.根据权利要求3所述的反序列化代码生成方法,其特征在于,所述2)中对被序列化对象进行依赖分析,获取所有依赖对象和依赖关系,具体包括:
21)抽取被分析对象类型,将对象分类为值类型、类类型、函数类型、闭包类型、类实例类型、装饰器类型和容器类型;
22)根据21)所述对象类型处理被分析对象,分析对象存在的依赖关系,所述依赖关系包括嵌套变量引用关系、全局变量引用关系、实例关系、成员关系、闭包关系、装饰关系和包含关系;最后,记录与被分析对象存在上述依赖关系的所有依赖对象;
23)对22)所述依赖对象重复21)~22)步骤,直到被分析对象不存在上述依赖关系;
所述22)的依赖关系识别方法,包括:
嵌套变量引用关系,被分析对象内存在指向所述嵌套变量的引用,被分析对象对所述嵌套变量存在嵌套变量引用关系;
全局变量引用关系,被分析对象内存在指向所述全局变量的引用,被分析对象对所述全局变量存在全局变量引用关系;
实例关系,被分析对象是类类型对象的类实例类型对象,被分析对象对所述类类型对象存在实例关系;
成员关系,被分析对象是类实例类型对象,被分析对象的成员包含其他对象,被分析对象与前述对象存在成员关系;前述对象指被分析对象成员中的其他对象;
闭包关系,被分析对象是函数类型对象的闭包类型对象,被分析对象对所述函数类型对象存在闭包关系;
装饰关系,被分析对象是类类型对象、函数类型对象或闭包类型对象,且被装饰器类型对象装饰,被分析对象对装饰器类型对象存在装饰关系;
包含关系,被分析对象是容器类型对象,且包含其他对象,被分析对象与其他对象存在包含关系;
所述22)依赖对象识别方法,包括,与被分析对象成立上述依赖关系的所有对象。
5. 根据权利要求1所述的反序列化代码生成方法,其特征在于,所述3) 分析所述依赖对象的对象类型和所属模块,生成创建对应对象的代码语句,具体包括:
31)根据依赖关系遍历所有依赖对象进行分析;
32)抽取被分析对象的对象类型和所属模块;
33)根据被分析对象的对象类型和所属模块生成代码语句;
所述32)中,被分析对象的所属模块分类,包括主模块、内置模块和导入模块;
所述33)中,创建被分析对象的代码语句生成,代码语句包括:类定义语句、函数定义语句、函数调用语句、装饰器语句和模块导入语句;
类定义语句:符合Python类定义语法的ClassDef语句;
函数定义语句:符合Python函数定义语法的FuncDef语句;
函数调用语句:符合Python函数定义语法的Call语句;
装饰器语句:符合Python装饰器语法的Decorator语句;
模块导入语句:符合Python模块导入语法的Import/ImportFrom语句;
赋值语句:符合Python赋值语法的Assign语句。
6.根据权利要求1所述的反序列化代码生成方法,其特征在于,所述4)对代码语句排序,生成反序列化代码,包括按照所述依赖关系对代码语句进行排序,并拼接为字符串,返回该字符串;所述排序方式为,依赖关系的遍历顺序逆序。
7.一种Python对象的反序列化代码生成装置,其特征在于,包括:
配置单元,用于确定序列化对象的存储目录;
上下文分析单元,用于在函数接口接收被序列化对象时获取该收被序列化对象的上下文信息;
依赖分析单元,用于解析被分析对象的对象类型、依赖关系和依赖对象;
依赖对象总线,用于存储和传输上述依赖对象;
序列化单元,用于对被序列化对象进行序列化,并存储至所述存储目录;
语句生成单元,用于解析被分析对象的对象类型和所属模块,生成创建对应对象的代码语句;
语句总线,用于存储和传输上述代码语句;
代码生成单元,用于对前述代码语句进行排序,生成最终反序列化代码字符串并输出。
8.根据权利要求7所述的Python对象的反序列化代码生成装置,其特征在于,所述序列化单元,具体用于:
对对象进行序列化时根据其内容生成MD5哈希地址,以上述哈希地址为文件名创建文件并写入序列化内容,存储至所述配置单元的存储目录。
9.根据权利要求7所述的Python对象的反序列化代码生成装置,其特征在于,所述语句生成单元,其用途还包括:
生成代码语句时,使用序列化单元对对象数据进行序列化,并在代码语句中回填存储路径。
10.根据权利要求7所述的Python对象的反序列化代码生成装置,其特征在于,所述依赖对象总线,用于:
从依赖分析单元获取依赖对象作为输入;向序列化单元和语句生成单元输出从依赖分析单元输入的依赖对象;
所述语句总线,用于:
从语句生成单元获取语句作为输入;向代码生成单元输出从语句生成单元输入的语句。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310845505.7A CN116820428A (zh) | 2023-07-11 | 2023-07-11 | 一种反序列化代码生成方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310845505.7A CN116820428A (zh) | 2023-07-11 | 2023-07-11 | 一种反序列化代码生成方法及装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN116820428A true CN116820428A (zh) | 2023-09-29 |
Family
ID=88118350
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202310845505.7A Pending CN116820428A (zh) | 2023-07-11 | 2023-07-11 | 一种反序列化代码生成方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN116820428A (zh) |
-
2023
- 2023-07-11 CN CN202310845505.7A patent/CN116820428A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109800175B (zh) | 一种基于代码插桩的以太坊智能合约重入漏洞检测方法 | |
US10296307B2 (en) | Method and system for template extraction based on source code similarity | |
US10698682B1 (en) | Computerized software development environment with a software database containing atomic expressions | |
CN106991100B (zh) | 数据导入方法及装置 | |
CN108469955B (zh) | 一种基于注解的Android注入框架实现方法 | |
CN109614329B (zh) | 一种基于接口控制文件的软件测试用例辅助设计方法 | |
CN113296786B (zh) | 数据处理方法、装置、电子设备及存储介质 | |
CN111078555A (zh) | 一种测试文件的生成方法、系统、服务器和存储介质 | |
KR20080038306A (ko) | 널가능과 후 바인딩 | |
JP2000029674A (ja) | アプリケ―ションソフトウェア構成方法 | |
US7500229B2 (en) | Program converting method and storage medium | |
US20150088483A1 (en) | Simulated component connector definition and connection process | |
CN113254024A (zh) | 代码继承关系优化方法、装置、设备及存储介质 | |
Brucker et al. | A formal model of the Document Object Model | |
CN113138755A (zh) | 一种json序列化和反序列化的优化方法及系统 | |
CN112860264A (zh) | 一种抽象语法树重构方法及装置 | |
US9383972B2 (en) | Methods and arrangements for processing and presentation of information | |
Fritzson et al. | Metamodelica–a symbolic-numeric modelica language and comparison to julia | |
CN111158665A (zh) | 代码生成方法及装置、电子设备和存储介质 | |
CN116820428A (zh) | 一种反序列化代码生成方法及装置 | |
Gabrijelčič | Mastering Delphi Programming: A Complete Reference Guide: Learn all about building fast, scalable, and high performing applications with Delphi | |
US8010572B1 (en) | Kstore scenario simulator processor and XML file | |
US11442845B2 (en) | Systems and methods for automatic test generation | |
CN109254774A (zh) | 软件开发系统中代码的管理方法和装置 | |
CN114816356A (zh) | 基于接口文档生成http请求代码的系统及方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |